为了在翻译上显示出区别,Attribute一般被翻译为特性,Property被译为属性。
在使用上面,Angular已经表明态度

Template binding works with properties and events, not attributes.
模板绑定是通过 property 和事件来工作的,而不是 attribute。

jQuery中的prop()和attr()如何选择,众说纷纭...

两种主流观点:

  1. 对于一些公认的attribute和property,使用setAttribute(),理由是property会出现class映射过去为className,名称不统一的问题。
  2. 红宝书作者推荐操作DOM property,因为在浏览器上面表现的比较一致。

HTML attribute & DOM property 关系与区别

引用Angular文档中的一段话去概括两者的关系和区别:

HTML attribute 与 DOM property 的对比
attribute 是由 HTML 定义的。property 是由 DOM (Document Object Model) 定义的。
少量 HTML attribute 和 property 之间有着 1:1 的映射,如id。
有些 HTML attribute 没有对应的 property,如colspan。
有些 DOM property 没有对应的 attribute,如textContent。

普遍原则:

  1. HTML attribute 初始化 DOM property,然后它们的任务就完成了。
  2. 更改 attribute 的值,相当于再次初始化DOM property 。
  3. 更改 property 的值,property值改变,attribute值不变。

几个有代表性的映射表

HTML attribute DOM property
id id
class className
checked = 'checked' checked 值为true

普遍原则失效的情况

为什么说是普遍原则呢?在低版本的ie中,操作DOM property中的value,attribute中的value也发生了改变。完全不讲道理 - -

<input type="text" value="123" id="myInput">

更改HTML attribute

myInput.setAttribute('value', 'test Attr');  
浏览器 myInput.getAttribute('value') myInput.value
chrome ie11 ff test Attr test Attr
ie8 test Attr test Attr

更改DOM property

document.getElementById('myInput').value = 'test property'; 
浏览器 myInput.getAttribute('value') myInput.value
chrome ie11 ff 123 test property
ie8 test property (普遍原则下应该为123) test property

prop()和attr()的选择

  • prop()采用的是更改DOM property的方式,基本上对应更改DOM属性。
原生DOM jQuery 操作
element.value $element.prop( name[,value]) 读写
delete element.propertyName $element.removeProp( propertyName ) 删除
  • attr() 采用的是更改HTML attribute的方式,基本上对应DOM中提供的三个操作attribute的方法。
原生DOM jQuery 操作
element.getAttribute(name) $element.attr(name) 读
element.setAttribute(name,value) $element.attr(name ,value) 写
delete element.removeAttribute(name) $element.removeAttr( name ) 删除

小结

  • 获取一些标签上面的的自定义属性,或者一些基本不会改变的特性的时候,多数情况下用attr()(data-*等除外)。
  <form action="test.php" user-my-name="nilinli" method="post"></form>
  $('form').attr('user-my-name'); // nilinli
$('form').attr('action'); // test.php
  • 其他情况下,操作DOM与页面交互,一般情况下用prop()
  • 总的来说,尽量操作DOM property,只有在没有DOM property(自定义attribute或者没有相关映射),才去操作HTML attribute。

前端中的 Attribute & Property的更多相关文章

  1. C#中的Attribute Property区别

    Attribute 一般译作"特性",Property 仍然译为"属性". Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰 ...

  2. HTML中的attribute和property

    一.概述 attribute和property是常常被弄混的两个概念. 简单来说,property则是JS代码里访问的: document.getElementByTagName('my-elemen ...

  3. 浅析C#中的Attribute(转)

    最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [Attribu ...

  4. 关于C# 中的Attribute 特性

    关于C# 中的Attribute 特性 作者: 钢钢  来源: 博客园  发布时间: 2011-01-09 23:30  阅读: 13921 次  推荐: 12   原文链接 [收藏] 摘要:纠结地说 ...

  5. C#中的Attribute

    最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [Attribu ...

  6. Element link doesn't have required attribute property

    前端标准http://validator.w3.org/ 拒绝你的代码时报 Element link doesn't have required attribute property 把样式链接 &l ...

  7. 浅析C#中的Attribute

    原文地址:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html 一.什么是Attribute 先看下面的三段代码: 1.自定义Att ...

  8. C#中的Attribute详解(下)

    原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...

  9. 说说移动前端中 viewport (视口)

    转载网络资源的文章:来源不详~~ 移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设 ...

随机推荐

  1. 【原创】大数据基础之Logstash(6)mongo input

    logstash input插件之mongodb是第三方的,配置如下: input { mongodb { uri => 'mongodb://mongo_server:27017/db' pl ...

  2. O033、Terminate Instance 操作详解

    参考https://www.cnblogs.com/CloudMan6/p/5486066.html   本节通过日志详细分析 Nova Terminate 操作.Terminate 操作就是删除 i ...

  3. Spring中常用的设计模式之:代理模式

    看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以 ...

  4. 实现双向绑定Proxy比defineproperty优劣如何?

    前言 双向绑定其实已经是一个老掉牙的问题了,只要涉及到MVVM框架就不得不谈的知识点,但它毕竟是Vue的三要素之一. Vue三要素 响应式: 例如如何监听数据变化,其中的实现方法就是我们提到的双向绑定 ...

  5. 仍然有人在叫喊C语言已经过时了

    现在,仍然有人在叫喊C语言已经过时了.还有什么值得学习的?看看现在使用Python.PHP和其他语言有多简单.谁去学旧的C语言?是真的吗?作者下载了这两种语言的底层源代码.由于空间的限制,它没有分析框 ...

  6. ASP.NET数据库连接类(SqlDBHelper)

    第一步:创建一个名为SqlDBHelper的类,用来作为联通数据库和系统之间的桥梁. 第二步:引入命名空间,如果System.Configuration.System.Transcations这两个命 ...

  7. 原创博客>>>解决粘包问题的方法

    目录 原创博客>>>解决粘包问题的方法 原创博客>>>解决粘包问题的方法 服务端: import socket import struct service=sock ...

  8. 第十一章·Filebeat-使用Filebeat收集日志

    Filebeat介绍及部署 Filebeat介绍 Filebeat附带预构建的模块,这些模块包含收集.解析.充实和可视化各种日志文件格式数据所需的配置,每个Filebeat模块由一个或多个文件集组成, ...

  9. main特别之处

    //package new_Object; public class Main{ public static void main(String[] args) { System.out.println ...

  10. MySQL 高级 视图 事物 触发器 函数 索引优化

    视图 1.什么是视图 ​ 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ​ 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view t ...