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 相关文章推荐
asp.net中System.Timers.Timer的使用方法
Mar 20 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
Aug 05 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
jQuery插件zTree实现删除树子节点的方法示例
Mar 08 Javascript
tab栏切换原理
Mar 22 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
Javascript地址引用代码实例解析
Feb 25 Javascript
利用node.js开发cli的完整步骤
Dec 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Python socket实现简单聊天室
2018/04/01 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
签约仪式主持词
2014/03/19 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL