property和attribute的汉语翻译几乎相同,都有“属性”的意义(这里姑且称attribute为“特性”,以方便区分),而他们的取值也经常相同,但有时又会踩坑,发现二者会不相等,不同步。

0.奇葩的IE

本 文开始之前不得不提一下万恶之源IE,在IE<9中,浏览器会把所有的property和attribute强制映射,即property = attribute. (class特殊:className = class)。正因为IE<9中的这种映射误导了很多人以为二者完全相同。

1. Property

每 个DOM节点都是一个object对象,它可以像其他的js Object一样具有自己的property和method,所以property的值可以是任何数据类型,大小写敏感,原则上property应该仅供 js操作,不会出现在html中(默认属性除外:id/src/href/className/dir/title/lang等),和其他js object一样,自定义的property也会出现在object的for…in遍历中。

eg. var list=[];for(var key in document.body) {list.push(key)}console.log(list.join('\n'));
2. Attribute

attribute出现 在dom中,js提供了getAttribute/setAttribute等方法来获取和改变它的值,attribute 的值只能是字符串且大小写不敏感,最后作用于html中,可以影响innerHTML获取的值。可以通过访问dom节点的attributes属性来获取 改节点的所有的attribute。(在IE<9中,attribute获取和改变的实际上是property。)

3.自定义的Property与Attribute不同步,不相等
  html: <input type='text' id='test' value />js: var test = document.getElementById('test');test.self = 'selfProperty'; console.log(test.self) =>  'selfProperty'test.getAttribute('self') => nullconclusion:自定义的property与自定义的attribute无同步关系
4.非自定义的DOM property与 attributes 是有条件同步的

非 自定义的属性(id/src/href/name/value等),通过setAttribute修改其特性值可以同步作用到property 上,而通过.property修改属性值有的(value)时候不会同步到attribute上,即不会反应到html上(除以下几种情况,非自定义属性 在二者之间是同步的)。

  • 非自定义属性(id/src/href/name/value等)未显式定义在dom中才会时,初始的property与attribute不同

    html:  <input type='text' id=“testvalue” />初始值property:  testvalue.value => “"初始值attribute: testvalue.getAttribute('value’) => null
  • input:value/checked的单向同步关系
    通过setAttribute改变input的value/checked都会同步到property中,但是,一旦改变他们的property值,就打破同步机制

     html:  <input type='text' id=“testvalue” value='sync' />property:  testvalue.value => 'sync'attribute: testvalue.getAttribute('value’) => 'sync'testvalue.setAttribute('value','abc') => 'abc'则属性会同步: testvalue.value => 'abc'testvalue.value = 'ddd';则同步机制失效: testvalue.getAttribute('value’) => 'abc'
  • 同步不是复制,同步机制依旧,值不同(src/href)
    通过getAttribute获取的是href/src的实际值,而点号(property)获取的是完整的url。

     html: a(id="testHr" href="/test/")property:  testHr.href="/blog/" => 'http://f2e.souche.com/blog/'attribute: testHr.getAttribute('href’) => '/blog/'
  • 非直接映射的同步,虽然同步了,但是同步后的属性名字不同,或者取值方式不同:class/data-XX/style
    class映射成className
    data-XXX映射到 dataset.XXX,通过JQuery的attr,prop访问时候不同步。
    style属性不接受字符串型赋值,只能通过style.XXX

    html: <input type='text' class="abc" data-id="123" id=“testvalue” value='sync' />testvalue.getAttribute('class') <=>testvalue.classNametestvalue.setAttribute('style','color:red') <=> testvalue.style.colortestvalue.getAttribute('data-id')<=> testvalue.dataset.id
小结

property与attribute都是dom的核心功能,鉴于有的属性上会出现单项同步的情况似乎attribute貌似更保险一点,以下是二者的关系表:

原文:http://web.jobbole.com/83388/

转自:DOM中Property与Attribute的区别

DOM中Property与Attribute的区别相关推荐

  1. C#中Property和Attribute的区别

    Attribute 字段 Property 属性(get;set;) 属性的正常写: private string name; public string Name { get { return na ...

  2. JavaScript 中 Property 和 Attribute 的区别

    转自:http://www.cnblogs.com/elcarim5efil/p/4698980.html property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(pro ...

  3. 【译】详解HTML中property和attribute的区别

    翻看Vue API文档时发现v-bind有一个修饰符.prop比较特殊: .prop - 作为一个 DOM property 绑定而不是作为 attribute 绑定. 文档还给了一个stack ov ...

  4. Property 和 Attribute 的区别(转)

    property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute:特性),但实际上,二者是不同的东西,属于不同的范畴. property ...

  5. HTML property 和 attribute 的区别

    前端编程里,property 和 attribute 是一对极容易混淆的术语. Angular 的属性绑定语法: <img [src]="itemImageUrl"> ...

  6. property和attribute的区别

    property是指类向外提供的数据区域. 而attribute则是描述对象在编译时或运行时属性的,分为固有型和用户自定义型,其中用户自定义型可以利用Reflection在运行期获取. 这两者是有本质 ...

  7. 一个简单的例子学习 HTML 元素property和attribute的区别

    源代码: <html> <style> </style><button disabled>Click</button> <button ...

  8. css property 和 attribute 的区别

    css property可以包含下列这些属性: Value: legal values & syntax Initial: initial value Applies to: elements ...

  9. Dom 中 children 与childNodes 的区别

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

最新文章

  1. hive 列转行_掌握这个SQL技巧超越80%的人——行转列/列转行
  2. windows10 删除文件 的权限才能对此文件夹进行更改 解决办法
  3. 11年瑞纳手动挡值多少钱_三分钟让你知道手中的松石值多少钱
  4. 网页打不开,却能上qq,何解?
  5. mysql远程连接数据库的二种方法_mysql 远程连接数据库的二种方法
  6. linux网络管理基本命令
  7. java安全编码指南之:方法编写指南
  8. C++基础11-类和对象之操作符重载1
  9. php模拟input 的file上传文件
  10. macos怎么装mysql80_Mac下MySQL安装配置教程
  11. iOS绘制1像素的线
  12. Fiddler证书安装(查看HTTPS)
  13. android 平板 吃鸡,吃鸡不卡的安卓平板
  14. 【表格合并单元格】vue-elementul表格动态合并实现方法,合并行,合并列方法【详细讲解,看完就理解】
  15. iOS - UILabel点击选中文字,部分高亮,YYLabel
  16. 快捷键切换(Linux)
  17. 三维形体的数据结构(1)半边数据结构
  18. 电脑蓝屏了,错误代码:0x000000CE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
  19. IT中高端人才招聘技巧
  20. level2买股技巧_同花顺Level-2教你看清个股真实交易数据

热门文章

  1. 扩散(信息学奥赛一本通-T1437)
  2. 生日蛋糕(信息学奥赛一本通-T1441)
  3. 最大子矩阵(信息学奥赛一本通-T1282)
  4. 位数问题(信息学奥赛一本通-T1313)
  5. 信息学奥赛一本通C++语言——1102: 与指定数字相同的数的个数
  6. 35 SD配置-销售凭证设置-定义项目类别组
  7. matlab 嵌入式,面向嵌入式系统的 MATLAB 和 Simulink
  8. python内置函数可以用来_Python内置函数——compile
  9. 记录几个CentOS安装包(rpm)的下载地址-离线安装必备
  10. linux内核那些事之buddy(anti-fragment机制)(4)