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代码经典广告
Oct 21 Javascript
jquery 日期分离成年月日的代码
May 14 Javascript
javascript实现淘宝幻灯片广告展示效果
Apr 27 Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 Javascript
详解JavaScript RegExp对象
Feb 04 Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
详解vue移动端项目代码拆分记录
Mar 15 Javascript
webpack的 rquire.context用法实现工程自动化的方法
Feb 07 Javascript
基于JS实现视频上传显示进度条
May 12 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
PHP count()函数讲解
2019/02/03 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
js查错流程归纳
2012/05/04 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
详解js类型判断
2018/05/22 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
Python Django使用forms来实现评论功能
2016/08/17 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
python3实现windows下同名进程监控
2018/06/21 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
用python制作个音乐下载器
2021/01/30 Python
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
夜大毕业生自我鉴定
2013/10/31 职场文书
办公室文员工作自我评价
2013/12/01 职场文书
地质灾害防治方案
2014/05/14 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
社区好人好事材料
2014/12/26 职场文书
发布会邀请函
2015/01/31 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
你知道Java Spring的两种事务吗
2022/03/16 Java/Android