前面的话

  其实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. 在mvc里面有htmlhelper方法,在webform里面有什么?

    终于是找到原来在webform里面已经提供了htmlcontrol这样的控件,可以直接拿来用.以前一直在想mvc有htmlhelper,webform里面不能用,其实是webform里面已经有了. 例 ...

  2. Hibernate中Criteria的完整用法

    1,CriteriaHibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria .2,De ...

  3. ZeroMQ(ZMQ)函数接口英汉直译

    找了好多地方都找不到ZMQ接口函数的中文文档,就厚着脸皮自己翻译了下.但因为作者本人涉世未深,翻译有错误的地方还请大家不吝赐教,在下感激不尽. 因为时间有限,只能一点一点翻译了. ZMQ接口文档的官方 ...

  4. perl学习之路1

    一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...

  5. >xx.hbm.xml的一些简单配置

    1.在hibernate-mapping的属性里有一个package,它的意思是以下的类都是在这个包下的,下面写类路径的时候,可以不写包名 2.class标签 name属性指的是类 table属性指的 ...

  6. xml中DTD解析

    DTD的作用是"文档类型的定义" DTD申明始终以<!DOCTYPE开头(开头后空一格). 本标签一共有三种写法 一.内部DTD: <!DOCTYPE 根元素 [ 文档 ...

  7. iOS程序模块化设计

    一.模块化设计的概述: 模块化设计(Block-based design):对一定范围内的不同功能或相同功能的不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和 ...

  8. SSH配置与讲解

    一.Struts 首先介绍Struts,在web项目中加入Struts的jar包,并在Web.xml中添加Struts的配置: <filter>       <filter-name ...

  9. 微软借力.NET开源跨平台支持,布局物联网平台开发

    今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...

  10. Windows Azure一些小技巧集合

    我最近做了一个Windows Azure上面的项目,自己在做的过程中遇到了很多问题.有的是我自己摸索解决,有的是到网上寻找零碎的信息结合起来解决的.我感觉应当把某些解决方法集中一下,方便我以后查阅,也 ...