javascript中attribute和property的区别详解


Posted in Javascript onJune 05, 2014

DOM元素的attribute和property很容易混?x在一起,分不清楚,两者是不同的东西,但是两者又联系紧密。很多新手朋友,也包括以前的我,经常会搞不清楚。

attribute翻译成中文术语为“特性”,property翻译成中文术语为“属性”,从中文的字面意思来看,确实是有点区别了,先来说说attribute。

attribute是一个特性节点,每个DOM元素都有一个对应的attributes属性来存放所有的attribute节点,attributes是一个类数组的容器,说得准确点就是NameNodeMap,总之就是一个类似数组但又和数组不太一样的容器。attributes的每个数字索引以名值对(name=”value”)的形式存放了一个attribute节点。

<div class="box" id="box" gameid="880">hello</div>

上面的div元素的HTML代码中有class、id还有自定义的gameid,这些特性都存放在attributes中,类似下面的形式:
[ class="box", id="box", gameid="880" ]

可以这样来访问attribute节点:
var elem = document.getElementById( 'box' );
console.log( elem.attributes[0].name ); // class
console.log( elem.attributes[0].value ); // box

但是IE6-7将很多东西都存放在attributes中,上面的访问方法和标准浏览器的返回结果又不同。通常要获取一个attribute节点直接用getAttribute方法:

console.log( elem.getAttribute('gameid') ); // 880

要设置一个attribute节点使用setAttribute方法,要删除就用removeAttribute:

elem.setAttribute('testAttr', 'testVal');
console.log( elem.removeAttribute('gameid') ); // undefined

attributes是会随着添加或删除attribute节点动态更新的。
property就是一个属性,如果把DOM元素看成是一个普通的Object对象,那么property就是一个以名值对(name=”value”)的形式存放在Object中的属性。要添加和删除property也简单多了,和普通的对象没啥分别:

elem.gameid = 880; // 添加
console.log( elem.gameid ) // 获取
delete elem.gameid // 删除

之所以attribute和property容易混?x在一起的原因是,很多attribute节点还有一个相对应的property属性,比如上面的div元素的id和class既是attribute,也有对应的property,不管使用哪种方法都可以访问和修改。

console.log( elem.getAttribute('id') ); // box
console.log( elem.id ); // box
elem.id = 'hello';
console.log( elem.getAttribute('id') ); // hello

但是对于自定义的attribute节点,或者自定义property,两者就没有关系了。

console.log( elem.getAttribute('gameid') ); // 880
console.log( elem.gameid ); // undefined
elem.areaid = '900';
console.log( elem.getAttribute('areaid') ) // null

对于IE6-7来说,没有区分attribute和property:

console.log( elem.getAttribute('gameid') ); // 880
console.log( elem.gameid ); // 880
elem.areaid = '900';
console.log( elem.getAttribute('areaid') ) // 900

很多新手朋友估计都很容易掉进这个坑中。
DOM元素一些默认常见的attribute节点都有与之对应的property属性,比较特殊的是一些值为Boolean类型的property,如一些表单元素:

<input type="radio" checked="checked" id="raido">
var radio = document.getElementById( 'radio' );
console.log( radio.getAttribute('checked') ); // checked
console.log( radio.checked ); // true

对于这些特殊的attribute节点,只有存在该节点,对应的property的值就为true,如:

<input type="radio" checked="anything" id="raido">
var radio = document.getElementById( 'radio' );
console.log( radio.getAttribute('checked') ); // anything
console.log( radio.checked ); // true

最后为了更好的区分attribute和property,基本可以总结为attribute节点都是在HTML代码中可见的,而property只是一个普通的名值对属性。

// gameid和id都是attribute节点
// id同时又可以通过property来访问和修改
<div gameid="880" id="box">hello</div> 
// areaid仅仅是property
elem.areaid = 900;
Javascript 相关文章推荐
Mootools 1.2教程 输入过滤第一部分(数字)
Sep 15 Javascript
JS request函数 用来获取url参数
May 17 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
Apr 05 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
May 28 Javascript
浅析js设置控件的readonly与enabled属性问题
Dec 25 Javascript
jquery中live()方法和bind()方法区别分析
Jun 23 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
Apr 19 Javascript
如何使用JS在HTML中自定义字符串格式化
Jul 20 Javascript
jquery实现楼层滚动效果
Jan 01 jQuery
浏览器调试动态js脚本的方法(图解)
Jan 19 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
Sep 27 Javascript
浅谈对于react-thunk中间件的简单理解
May 01 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
Jun 05 #Javascript
用js的document.write输出的广告无阻塞加载的方法
Jun 05 #Javascript
javascript数组去重方法终极总结
Jun 05 #Javascript
javascript设计模式之解释器模式详解
Jun 05 #Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 #Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 #Javascript
封装了一个支持匿名函数的Javascript事件监听器
Jun 05 #Javascript
You might like
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
分享10段PHP常用代码
2015/11/11 PHP
thinkPHP查询方式小结
2016/01/09 PHP
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
JavaScript获取onclick、onchange等事件值的代码
2013/07/22 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
原生js实现日历效果
2020/03/02 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python中模块与包有相同名字的处理方法
2017/05/05 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
python使用turtle库绘制时钟
2020/03/25 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
python里 super类的工作原理详解
2019/06/19 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
劳模先进事迹材料
2014/12/24 职场文书
拾金不昧表扬信
2015/01/16 职场文书