区分元素特性attribute和对象属性property
前面的话
其实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的更多相关文章
- DOM对象属性(property)与HTML标签特性(attribute)
HTML中property与attribute是极易混淆的两个概念.大多数时候这两个单词都翻译为"属性",为了区分二者,一般将property翻译为"属性",a ...
- 彻底区分html的attribute与dom的property
当初在学html时始终没有弄清楚的关于attribute与property的区别,竟然在看angular文档时弄明白了. angular官方文档的数据绑定一节提到html attribute与dom ...
- Python高级语法-对象实例对象属性-Property总结(4.6.2)
@ 目录 1.说明 2.代码 关于作者 1.说明 property属性,返回的是值 不是callable的,也就是不能使用方法来调用 只能传入self,不能传入其他 用处,能返回局部数据,比如当分页的 ...
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...
- js 中对象属性特性的描述
如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable enumerable configable 有什么区别? 先预习一个用对象.属性 ...
- python 对象属性与 getattr & setattr
Python对象的属性可以通过obj.__dict__获得,向其中添加删除元素就可以实现python对象属性的动态添加删除的效果,不过我们应该使用更加正规的getattr和setattr来进行这类操作 ...
- DOM元素的Attribute(特性)和Property(属性) 【转载】
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- js便签笔记(2)——DOM元素的特性(Attribute)和属性(Property)
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- 理解特性attribute 和 属性property的区别 及相关DOM操作总结
查一下英语单词解释,两个都可以表示属性.但attribute倾向于解释为特质,而property倾向于解释私有的.这个property的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点: ...
随机推荐
- Linux基础命令-有关于目录的命令
1. 查看帮助: [root@oracle ~]# man cd //查看 cd 指令的帮助文档 2. 显示当前工作目录: [root@oracle ~]# pwd/root 3. 列出当前目录下的内 ...
- Python 键盘记录
之前写的键盘记录最后一直在纠结弹框与不弹框的问题,代码找不到了,今天重新来一遍 #!/usr/bin/env python# -*-coding:utf-8 -*-from ctypes import ...
- MySQL多表查询
第一种: select a.a1,a.a2,a.a3,b.b2,c.c2,d.d2 from a,b,c,d where a.a1=b.b1 and b.b1=c.c1 and c.c1=d.d1 第 ...
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate) 在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾 ...
- asp.net 项目Net4.0 在IE10、 IE 11 下出现 “__doPostBack”未定义 的解决办法
我的项目中,服务器端是Windows Server2008 64位,.net版本是4.0,也遇到了树形结构控件.DropDownList控件等不能调用服务器端代码.最后发现js报错. 错误信息:“__ ...
- SICAU教务系统登录密码加密算法的VB方式实现
关于一个算法.这个算法是SICAU教务系统在账号登录时采取的一个加密算法.算法的实现并不复杂. 具体如下: Function Form1pwdvalue(ByVal pwdvalue As Strin ...
- ubuntu的vim模式
之前想修改一个文件的内容,居然发现之前的东西又随着时间在空气中淡忘了,所以取了网上的一些摘文. 1.vim #在命令行中输入vim,进入vim编辑器 2. i #按一下i键,下端显示 --INSERT ...
- HDU Cow Sorting (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ...
- Reading C type declarations(引用http://unixwiz.net/techtips/reading-cdecl.html)
Even relatively new C programmers have no trouble reading simple C declarations such as int foo[5]; ...
- 续关于C#的微信开发的入门记录一
前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...