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 相关文章推荐
JavaScript对象和字串之间的转换实例探讨
Apr 21 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
Jun 28 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
jquery UI Datepicker时间控件的使用及问题解决
Apr 28 Javascript
Bootstrap选项卡学习笔记分享
Feb 13 Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 jQuery
axios异步提交表单数据的几种方法
Aug 11 Javascript
JS实现移动端在线签协议功能
Aug 22 Javascript
vue实现购物车小案例
Sep 27 Javascript
javascript实现支付宝滑块验证码效果
Jul 24 Javascript
vue中echarts引入中国地图的案例
Jul 28 Javascript
javascript canvas实现简易时钟例子
Sep 05 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
我的论坛源代码(三)
2006/10/09 PHP
一个简易需要注册的留言版程序
2006/10/09 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
js计算页面刷新的次数
2009/07/20 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
浅谈五大Python Web框架
2017/03/20 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
使用matplotlib画散点图的方法
2018/05/25 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
python属于软件吗
2020/06/18 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
室内设计专业个人的自我评价
2013/10/19 职场文书
陈欧广告词
2014/03/14 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
2014年体育部工作总结
2014/11/13 职场文书
代理词怎么写
2015/05/25 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
技术转让协议书
2016/03/19 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers