前面的话

  其实attribute和property两个单词,翻译出来都是属性,但是《javascript高级程序设计》将它们翻译为特性和属性,以示区分。本文将详细介绍特性和属性的不同之处

定义

  元素特性attribute是指HTML元素标签的特性

  下面的id、class、title、a都是特性,其中a叫做自定义特性

<div id="id1" class="class1" title="title1" a='a1'></div>

  对象属性property是指元素节点的属性

  下面的id、title、b都是属性,其中b叫做自定义属性

<div id="test"></div>
<script>
test.id = 'id2';
test.title = 'title2';
test.b = 'b2';
</script>

共有

  id、title等既是属性,也是特性。修改属性,其对应的特性会发生改变;修改特性,属性也会改变

  【1】修改元素特性(以title为例)

<div id="test" title='123'>测试内容</div>
<script>
console.log(test.title);//123
document.onclick = function(){
test.setAttribute('title','456');
console.log(test.title);//456
}
</script>

  【2】修改对象属性

<div id="test" title='123'>测试内容</div>
<script>
console.log(test.getAttribute('title'));//123
document.onclick = function(){
test.title = '456';
console.log(test.getAttribute('title'));//456
}
</script>

例外

  class和for这两个元素特性是例外,因为class和for是保留字,无法直接在对象属性中使用。所以在对象属性中,class变成了className,而for变成了htmlFor

  【1】class

<div id="test" class="class1">测试内容</div>
<script>
console.log(test.getAttribute('class'));//'class1'
console.log(test.className);//'class1'
console.log(test.class);//undefined
</script>

  【2】for

<label id="test" for="input"></label>
<script>
console.log(test.getAttribute('for'));//'input'
console.log(test.htmlFor);//'input'
console.log(test.for);//undefined
</script>

特殊

  style和onclick是两个特殊的特性,它们虽然有对应的属性名,但属性值与通过getAttribute()返回的值并不相同

  【1】style

  通过getAttribute()访问时,返回的style特性值中包含的是CSS文本,而通过属性来访问它则会返回一个CSSStyleDeclaration对象

<div id="test" style="height: 100px;width: 100px;"></div>
<script>
console.log(test.getAttribute('style'));//'height: 100px;width: 100px;'
//{0: "height", 1: "width", alignContent: "", alignItems: "", alignSelf: ""…}
console.log(test.style);
console.log(typeof test.style);//'object'
console.log(test.style.height);//'100px'
</script>

  【2】onclick

  如果通过getAttribute()访问,会返回相应代码的字符串。而访问onclick属性时,会返回一个javascript函数

  [注意]其他事件处理程序也类似

<div id="test" onclick = "alert(1)">测试内容</div>
<script>
console.log(test.getAttribute('onclick'));//'alert(1)'
console.log(test.onclick);//'function onclick(event) {alert(1)}'
console.log(typeof test.onclick);//'function'
</script>

  [注意]如果通过对象属性设置onclick属性,则不会有对应的元素特性

<div id="test">测试内容</div>
<script>
test.onclick = function(){
alert(1);
}
console.log(test.getAttribute('onclick'));//null
console.log(test.onclick);//'function onclick(event) {alert(1)}'
console.log(typeof test.onclick);//'function'
</script>

自定义

  【1】自定义特性

  自定义特性用来在HTML元素上绑定一些额外的信息。但是自定义特性无法在对象属性中有所体现

<div id="test" index='1'></div>
<script>
console.log(test.getAttribute('index'));//'1'
console.log(test.index);//undefined
</script>

  HTML5新增了数据集属性dataset(规范的自定义特性),用于存储页面或应用程序的私有定制数据。数据集属性以'data-'为前缀,可以使用javascript中对象属性dataset访问data-*的值

  由于元素特性的值以'-'做间隔,在对象属性中将转换为首字母大写的形式

data-index-one -> dataset.indexOne

  所以,元素特性的值一定不要出现大写,否则对象属性会解释出错

  [注意]IE10-浏览器不支持dataset

<div id="test" data-index-one="1"></div>
<script>
console.log(test.getAttribute('data-index-one'));//'1'
console.log(test['data-index-one']);//undefined
console.log(test.dataset.indexOne);//'1'
</script>

【兼容代码】

function getDataSet(element){
if(element.dataset){
return element.dataset;
}
var attrs= element.attributes;
var len = attrs.length;
var data = {};
for(var i=0;i<len;i++){
var sName = attrs[i].name;
var sValue = attrs[i].value;
if(sName.substring(0,5)==="data-"){
var tempName = sName.slice(5).replace(/-([A-Za-z])/g,function(item,item1){
return item1.toUpperCase();
});
data[tempName] = sValue;
}
}
return data;
}
var dataset = getDataSet(box);

  【2】自定义属性

  自定义属性在javascript中非常常用,是一种常用的编程技术。但元素特性上并不会有所体现

<div id="test"></div>
<script>
test.index = 1;
console.log(test.index);//1
console.log(test.getAttribute('index'));//null
</script>

  [注意]可以使用数据集属性的逆向操作来实现自定义属性向元素特性的对应

<div id="test"></div>
<script>
test.dataset.index = 1;
console.log(test.getAttribute('data-index'));//1
</script>

混淆

  IE7-浏览器下会混淆元素特性attribute和对象属性property。在下列情况下,IE7-浏览器通过getAttribute()返回的值与对象属性相同

  【1】class

  设置对象属性className,在IE7-浏览器下,访问元素特性时,参数也设置为className才有效

  [注意]for也有类似效果,不再赘述

<div id="test"></div>
<script>
test.className = 'class1';
//IE7-浏览器返回'class1',其他浏览器返回null
console.log(test.getAttribute('className')); //IE7-浏览器返回null,其他浏览器返回'class1'
console.log(test.getAttribute('class'));
</script>

  【2】style

  IE7-浏览器通过getAttribute()方法返回的元素特性与对象属性一样,都是CSSStyleDeclaration对象

  [注意]click等事件处理程序也有类似效果,不再赘述

<div id="test" style="width: 100px;"></div>
<script>
//IE7-浏览器下,返回CSSStyleDeclaration对象;其他浏览器返回'width: 100px;'
console.log(test.getAttribute('style'));
//IE7-浏览器下,返回true;其他浏览器返回false
console.log(test.getAttribute('style') === test.style);
</script>

  【3】自定义

  在IE8-浏览器下,自定义特性会自动对应为对象属性,自定义属性也会自动对应为元素特性

<div id="test" a='a1'></div>
<script>
test.b = 'b1';
//IE7-浏览器返回'a1',其他浏览器返回undefined
console.log(test.a);
//IE7-浏览器返回'b1',其他浏览器返回null
console.log(test.getAttribute('b'));
</script>

总结

  对象节点对于HTML标签元素说来,是元素DOM化的结果。与此相对应,对象属性也是元素特性的DOM化结果

  由于javascript中保留字的限制,存在class和for这两种例外情况

  与普通的元素特性不同,通过style实现的脚本化CSS机制和通过onclick等实现的事件处理机制是DOM的两大功能,它们被DOM实现为对象,而不仅仅是普通的字符串

  自定义特性和自定义属性非常有用,但却没有对应关系。HTML5新增的数据集属性dataset建立了两者的联系

  最后,IE7-浏览器对元素特性和对象属性有所混淆。如果网站仍然需要兼容IE7-浏览器,就要非常小心

  欢迎交流

区分元素特性attribute和对象属性property的更多相关文章

  1. DOM对象属性(property)与HTML标签特性(attribute)

    HTML中property与attribute是极易混淆的两个概念.大多数时候这两个单词都翻译为"属性",为了区分二者,一般将property翻译为"属性",a ...

  2. 彻底区分html的attribute与dom的property

    当初在学html时始终没有弄清楚的关于attribute与property的区别,竟然在看angular文档时弄明白了. angular官方文档的数据绑定一节提到html attribute与dom ...

  3. Python高级语法-对象实例对象属性-Property总结(4.6.2)

    @ 目录 1.说明 2.代码 关于作者 1.说明 property属性,返回的是值 不是callable的,也就是不能使用方法来调用 只能传入self,不能传入其他 用处,能返回局部数据,比如当分页的 ...

  4. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

  5. js 中对象属性特性的描述

    如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable   enumerable   configable   有什么区别? 先预习一个用对象.属性 ...

  6. python 对象属性与 getattr & setattr

    Python对象的属性可以通过obj.__dict__获得,向其中添加删除元素就可以实现python对象属性的动态添加删除的效果,不过我们应该使用更加正规的getattr和setattr来进行这类操作 ...

  7. DOM元素的Attribute(特性)和Property(属性) 【转载】

    1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...

  8. js便签笔记(2)——DOM元素的特性(Attribute)和属性(Property)

    1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...

  9. 理解特性attribute 和 属性property的区别 及相关DOM操作总结

    查一下英语单词解释,两个都可以表示属性.但attribute倾向于解释为特质,而property倾向于解释私有的.这个property的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点:  ...

随机推荐

  1. http://devdocs.io/【文档收藏】

    http://devdocs.io http://bower.io/ www.bower.iobrowserify.org jsPlumb布局 https://github.com/lndb/jsPl ...

  2. 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)

    时隔一年,再次编译cef3,独一无二的目的仍为加入mp3支持.新版本的编译环境和注意事项都已经发生了变化,于是再记录一下. 一.编译版本 cef版本号格式为X.YYYY.A.gHHHHHHH X为主版 ...

  3. Java:单例模式的七种写法

    第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton ( ...

  4. 一篇笔记带你快速掌握面向对象的Javascript(纯手打)

    /** * 创建对象 */ //1.工厂模式 //特点: //创建的对象无法识别其对象类型,不支持instanceof等判断方法,无法标识不同的对象 function createObj(name,s ...

  5. Activemq mqtt 点对点聊天实现(转载)

    我这想到一个点对点聊天的方法,不用没割人都建立一个topic了,思路还是自定义一个分发策略,具体如下: 1.  建立一个topic,所有人都用匹配订阅的方式订阅以该topic为头的topic,例如:所 ...

  6. redis的面试题,没答出来,直接被pass

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略:  volatile-lru:从已设置过期时间的数据集(server.db[i].expire ...

  7. ACCEPTANCE CRITERIA FOR USER STORIES

    One of the teams I have recently coached quickly got a grasp of how to phrase user stories but found ...

  8. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  9. mark

    *求数根公式:a的数根b = (a-1) % 9 + 1; *约瑟环问题:f1 = 0; 第i个(i>1),f = (f+m) %i;

  10. *POJ1830 高斯消元

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8010   Accepted: 3161 Description ...