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 相关文章推荐
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
ASP SQL防注入的方法
Dec 25 Javascript
javascript开发随笔二 动态加载js和文件
Nov 25 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
May 08 Javascript
JavaScript类型系统之基本数据类型与包装类型
Jan 06 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
Feb 25 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
Jan 21 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
Vue实现一个返回顶部backToTop组件
Jul 25 Javascript
详解用函数式编程对JavaScript进行断舍离
Sep 18 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
Oct 22 Javascript
微信小程序基于高德地图查找位置并显示文字
Oct 30 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(2)
2006/10/09 PHP
php常用的url处理函数总结
2014/11/19 PHP
学习php开源项目的源码指南
2014/12/21 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
javascript中xml操作实现代码
2011/11/21 Javascript
JS编程小常识很有用
2012/11/26 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
Python 获取主机ip与hostname的方法
2018/12/17 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Python连接字符串过程详解
2020/01/06 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
超市开店计划书
2014/04/26 职场文书
优质服务活动实施方案
2014/05/02 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
swagger如何返回map字段注释
2021/07/03 Java/Android
Java存储没有重复元素的数组
2022/04/29 Java/Android