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 获取LI里的内容
Dec 17 Javascript
JS Date函数整理方便使用
Oct 23 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
介绍JavaScript的一个微型模版
Jun 24 Javascript
Bootstrap的class样式小结
Dec 01 Javascript
webpack 模块热替换原理
Apr 09 Javascript
vue.js单文件组件中非父子组件的传值实例
Sep 13 Javascript
从理论角度讨论JavaScript闭包
Apr 03 Javascript
Angular单元测试之事件触发的实现
Jan 20 Javascript
js实现消灭星星(web简易版)
Mar 24 Javascript
详解React 条件渲染
Jul 08 Javascript
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
使用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.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
php微信开发之关注事件
2018/06/14 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
用jscript启动sqlserver
2007/06/21 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
详解VUE调用本地json的使用方法
2019/05/15 Javascript
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
python3 map函数和filter函数详解
2019/08/26 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
高校自主招生自荐信
2013/12/09 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
副董事长岗位职责
2014/04/02 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
努力工作保证书
2015/02/28 职场文书
女儿满月酒致辞
2015/07/29 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技