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 相关文章推荐
Dom在ajax技术中的作用说明
Oct 25 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
Jun 26 Javascript
js动态移动滚动条至底部示例代码
Apr 24 Javascript
JQuery中基础过滤选择器用法实例分析
May 18 Javascript
jquery对复选框(checkbox)的操作汇总
Jan 13 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
Jan 03 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
Feb 14 Javascript
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
vue2.0 实现页面导航提示引导的方法
Mar 13 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
react用Redux中央仓库实现一个todolist
Sep 29 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产生动态的影像图
2006/10/09 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
PHP5.3新特性小结
2016/02/14 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
django ajax发送post请求的两种方法
2020/01/05 Python
python实现查找所有程序的安装信息
2020/02/18 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
应聘护士自荐信
2013/10/21 职场文书
部队学习十八大感言
2014/01/11 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
2015毕业寄语大全
2015/02/26 职场文书
会议室管理制度范本
2015/08/06 职场文书