JavaScript中property和attribute的区别详细介绍


Posted in Javascript onMarch 03, 2015

1. 定义

Property:属性,所有的HTML元素都由HTMLElement类型表示,HTMLElement类型直接继承自Element并添加了一些属性,添加的这些属性分别对应于每个HTML元素都有下面的这5个标准特性: id,title,lang,dir,className。DOM节点是一个对象,因此,他可以和其他的JavaScript对象一样添加自定义的属性以及方法。property的值可以是任何的数据类型,对大小写敏感,自定义的property不会出现在html代码中,只存在js中。

Attribute:特性,区别于property,attribute只能是字符串,大小写不敏感,出现在innerHTML中,通过类数组attributes可以罗列所有的attribute。

2. 相同之处

标准的 DOM properties 与 attributes 是同步的。公认的(非自定义的)特性会被以属性的形式添加到DOM对象中。如,id,align,style等,这时候操作property或者使用操作特性的DOM方法如getAttribute()都可以操作属性。不过传递给getAttribute()的特性名与实际的特性名相同。因此对于class的特性值获取的时候要传入“class”。

3. 不同之处

1).对于有些标准的特性的操作,getAttribute与点号(.)获取的值存在差异性。如href,src,value,style,onclick等事件处理程序。
2).href:getAttribute获取的是href的实际值,而点号获取的是完整的url,存在浏览器差异。

<script>

      var a  = document.body.children[0]

      a.href = '/'

      alert( 'attribute:' + a.getAttribute('href') ) // '/'

      alert( 'property:' + a.href )  // IE: '/', others: full URL

  </script>

src的值的获取类似href,不过IE也会返回full URL;
value值同样存在一些 ‘one-way'(单向)同步的内置属性。
例如,input.value 从 attribute 中同步(即 property 从 attribute 中获得同步)

<input type="text" value="markup">

  <script>

       var input = document.body.children[0];

       input.setAttribute('value', 'new');

       alert( input.value ); // 'new', input.value changed

       alert( input.getAtrribute(value) ); // 'new'

  </script>

但是 attribute 不能从 property 中获得同步:

<input type="text" value="markup">

   <script>

        var input = document.body.children[0];

        input.value = 'new';

        alert(input.getAttribute('value'));  // 'markup', not changed!

  </script>

getAttribute获取的是初始值,而点号获取的是初始值或者.value修改后的值,例如当访问者输入了某些字符后,'value' attribute 在 property 更新后维持了原始值。原始值可以用来检验 input 是否变化,或者重置它。

对于style和onclick等事件处理程序,getAttribute方法访问时会返回字符串,而点号返回的是相应的对象和事件处理函数。

对于input中的checked属性

<script>

    var input  = document.body.children[0]

    alert( input.checked ) // true

    alert( input.getAttribute('checked') ) // empty string

  </script>

getAttribute获取的是你是实际设置的值。而点号返回的是布尔值。

浏览器兼容性上的差别

1.在IE<9的浏览器中,可以用点号和getAttribute在相互之间访问自定义属性。
2.IE<8(包括IE8种的IE7兼容模式),property和attribute相同。因为attribute对大小写不敏感,在这种情况下,用getAttribute访问特性的时候,浏览器会选择第一次出现的值。

document.body.abba = 1 // assign property (now can read it by getAttribute)

document.body.ABBA = 5 // assign property with another case

// must get a property named 'ABba' in case-insensitive way.

alert( document.body.getAttribute('ABba') ) // 1

优先选择property

在实际应用中,98%的 DOM 操作都是使用 properties。
只有两种情形需要使用attributes

1.自定义 HTML attributes,因为它并不同步到DOM property。
2.访问内置的 HTML attributes,这些 attribute 不能从 property 同步过来。例如 INPUT标签的value值。

Javascript 相关文章推荐
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
Feb 11 Javascript
Js+php实现异步拖拽上传文件
Jun 23 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
微信小程序 SocketIO 实例讲解
Oct 13 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
Mar 30 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
JS正则表达式验证中文字符
May 08 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
May 22 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
Mar 02 #Javascript
JS上传图片前实现图片预览效果的方法
Mar 02 #Javascript
JS控制弹出新页面窗口位置和大小的方法
Mar 02 #Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 #Javascript
JS实现的网页倒计时数字时钟效果
Mar 02 #Javascript
js实现在网页上简单显示时间的方法
Mar 02 #Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
Mar 02 #Javascript
You might like
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
js常用代码段整理
2011/11/30 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
python先序遍历二叉树问题
2017/11/10 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
Internal修饰符有什么含义
2013/07/10 面试题
物流合作计划书
2014/01/10 职场文书
就业表自我评价分享
2014/02/06 职场文书
房地产项目建议书
2014/03/12 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
学校政风行风整改方案
2014/10/25 职场文书