区分元素特性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的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点: ...
随机推荐
- 原生JS 年月日、省市区 三级联动
这个算生日日期,因为是从100年前的到现年. <select id="sel_year"></select> <select id="sel ...
- .NET CLI 命令
您可以立即使用的部分通用 .NET CLI 命令 命令 说明 dotnet new 使用 C# 语言初始化用于类库或控制台应用程序的有效项目. dotnet restore 还原在指定项目的 proj ...
- expect脚本语言用法示例
#!/usr/bin/expect set hostname [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $ar ...
- Web API Get Started First
注:此博客是自官网修剪而来,博主IT新手 一.web api与web service的不同: web api是基于Http协议,而web service是基于soap协议.两协议的区别小子看了很多,但 ...
- jsp 中 有没有类似java if else语句
<c:when test=""></c:when> <c:otherwise></c:otherwise> 有if else的功能 ...
- phpstudy虚拟机配置
PHPStudy是一个常用的PHP本地环境搭建的一个程序包,方便实用.对学习PHP的新手来说, WINDOWS下环境配置是一件很困难的事;对老手来说也是一件烦琐的事.因此无论你是新手还是老手,该程序包 ...
- hoj 1014 Niven Numbers
新手上路之我的水题之路 刚开始时,我首先想到的是定义一个int数组,然后让输入的数字从最低位开始在循环不断地*base,从而将 k进制转化成十进制:然后再作取模判断就可以了: 这时在将最低位到最高位依 ...
- web app iphone4 iphone5 iphone6 响应式布局 适配代码
在网页中,pixel与point比值称为device-pixel-ratio,普通设备都是1,iPhone 4是2,有些Android机型是1.5.] 那么-webkit-min-device-pix ...
- laravel5.2,注册服务提供者时无法生效
laravel中注册服务提供者原本很简单,只要运行下指令php artisan make:provider TestServiceProvider,然后在config/app.php的provider ...
- easyUI在IE浏览器中列表不显示
搜索网上答案挺多,这里我说下我遇到的问题. 我是在页面中有一个toolbar:toolbar属性,但是没有定义toolbar而IE兼容差就不能正确显示. 而其它浏览器兼容性高没问题.其它问题再搜吧!