前端中的 Attribute & Property
为了在翻译上显示出区别,Attribute一般被翻译为特性,Property被译为属性。
在使用上面,Angular已经表明态度
Template binding works with properties and events, not attributes.
模板绑定是通过 property 和事件来工作的,而不是 attribute。
jQuery中的prop()和attr()如何选择,众说纷纭...
两种主流观点:
- 对于一些公认的attribute和property,使用
setAttribute(),理由是property会出现class映射过去为className,名称不统一的问题。 - 红宝书作者推荐操作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。
普遍原则:
- HTML attribute 初始化 DOM property,然后它们的任务就完成了。
- 更改 attribute 的值,相当于再次初始化DOM property 。
- 更改 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的更多相关文章
- C#中的Attribute Property区别
Attribute 一般译作"特性",Property 仍然译为"属性". Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰 ...
- HTML中的attribute和property
一.概述 attribute和property是常常被弄混的两个概念. 简单来说,property则是JS代码里访问的: document.getElementByTagName('my-elemen ...
- 浅析C#中的Attribute(转)
最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [Attribu ...
- 关于C# 中的Attribute 特性
关于C# 中的Attribute 特性 作者: 钢钢 来源: 博客园 发布时间: 2011-01-09 23:30 阅读: 13921 次 推荐: 12 原文链接 [收藏] 摘要:纠结地说 ...
- C#中的Attribute
最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [Attribu ...
- Element link doesn't have required attribute property
前端标准http://validator.w3.org/ 拒绝你的代码时报 Element link doesn't have required attribute property 把样式链接 &l ...
- 浅析C#中的Attribute
原文地址:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html 一.什么是Attribute 先看下面的三段代码: 1.自定义Att ...
- C#中的Attribute详解(下)
原文地址:https://blog.csdn.net/xiaouncle/article/details/70229119 C#中的Attribute详解(下) 一.Attribute本质 从上篇里我 ...
- 说说移动前端中 viewport (视口)
转载网络资源的文章:来源不详~~ 移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设 ...
随机推荐
- 利用Cmake 将最新版本OBS编译成windows版本。
准备工作: 1. VS2013 的最新更新版或者VS2015 2. QT Creater 5.7 https://www.qt.io/ 3. CMake (cmake-gui) 4. obs 依 ...
- Laravel 查询数据按照时间分组
首先取消严格模式: // config/database.php // 'strict' => true, // 严谨模式注释掉 查询构造器代码: //查询构造器部分代码 })->with ...
- 客户端注册Cannot execute request on any known server解决
在对eureka注册中心服务端添加安全验证后,新版本springcloud出现一个问题就是,在客户端注册到服务中心时报了一个错:Cannot execute request on any known ...
- java字符串大小写转换
String test="SHA34cccddee"; System.out.println(test.toUpperCase());//小写转大写 String test= ...
- dom和bom之间的区别
BOM的核心是windows,表示的是一个浏览器的实例,在网页中自定义的任何一个对象.变量和函数,都以windows作为其全局对象 DOM是针对HTML和XML文档的一个API bom:(Browse ...
- vue中watch深度监听
监听基本类型的都是浅度监听 watch的深度监听,监听复杂类型都是深度监听(funciton ,arrat ,object) // 监听对象 data(){ return { a:{ b:, c: } ...
- C++虚函数和纯虚函数的用法和区别
C++虚函数与纯虚函数用法与区别(转) 1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能 ...
- Win10 OpenCV3.3.0+VS2013配置大坑,OpenCV解决方案编译报错“找不到python36_d.lib”错误
今天因为想要用OpenCV做图像识别,小白一个,在网上找到一个教程,但是需要配置OpenCV3.3.0的环境,于是又在网上找OpenCV3.3.0+VS2013(因为我之前已经安过了VS2013),前 ...
- Visual Studio 2019社区版:错误 MSB6006 “CL.exe”已退出,代码为 2
系统:win10 环境:Visual Studio 2019社区版 问题:错误 MSB6006 “CL.exe”已退出,代码为 2 解决方法: 1 一个类内部的定义返回类型为double的方法种没有写 ...
- 移动端的文本框获取焦点时导致fixed或absolute定位的按钮被手机键盘顶上去的问题
var win_h = $(window).height();//关键代码 window.addEventListener('resize', function () { if($(window).h ...