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 相关文章推荐
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
May 27 Javascript
如何使用jquery动态加载js,css文件实现代码
Apr 03 Javascript
自动刷新网页,自动刷新当前页面,JS调用
Jun 24 Javascript
jquery常用操作小结
Jul 21 Javascript
jquery插件格式实例分析
Jun 16 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
jQuery中的一些小技巧
Jan 18 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
微信小程序一周时间表功能实现
Oct 17 Javascript
vue路由 遍历生成复数router-link的例子
Oct 30 Javascript
JavaScript实现省份城市的三级联动
Feb 11 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
Apr 20 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 定义404页面的实现代码
2012/11/19 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python如何输出反斜杠
2020/06/18 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
你们项目是如何进行变更控制的
2015/08/26 面试题
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
教师专业理论水平的自我评价分享
2013/11/09 职场文书
公司财务总监岗位职责
2013/12/14 职场文书
年终奖发放方案
2014/06/02 职场文书
死亡证明书样本说明
2014/10/18 职场文书
护士旷工检讨书
2015/08/15 职场文书
python urllib库的使用详解
2021/04/13 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
Go 语言结构实例分析
2021/07/04 Golang
Java spring定时任务详解
2021/10/05 Java/Android
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL