jQuery .attr() vs. .prop()
Property vs. Attribute
在开始正式比较prop()和attr()两个jQuery方法之前,我们有必要先弄清一下Property和Attribute两个单词的意思。在中文里面,它们都是属性的意思,那究竟有什么区别呢?我是这么理解的(曾经在《深入浅出WPF》一书中看到过一些关于XAML相关的解释,觉得这里也是适用的):
Property - 属性、字段,这是站在面向对象的层面去理解的,当我们将现实中的某一物体用代码把它抽象出来时,那么它的属性我们就用Property来表示。在这里我们要研究的其实是DOM 元素,例如 input checkbox,它就是现实中的一个复选框,那么Javascript描述它时就赋予了它很多属性,id表示它的唯一标识,type表示它的类别,checked表示它的状态等等,我们就称这些为Property。
Attribute - 特性,更多的我将它称为特性。这是站在编译的层面去理解它的,我们知道HTML它是一种标记语言,什么意思,就是一个标签最后会被编译器编译为一个DOM对象
<input type="checkbox" id="chk1" class="sampleclass">
会被编译为一个DOM Element,而这里的type,id我们就称之为Attribute,你会发现这里的AttributeName和上面提到的PropertyName有些会同名,没错,它们用来初始化DOM对象的一些属性,假设被编译出的对象是elem,那么elem.type就是checkbox,elem.id就是chk1,所有在我看来,Attribute其实是给编译器看的。Attribute名称不一定都是和Property一一对应的,例如Attribute的class <–> Property的classname,这些不是我们关心的,只要编译器知道其中的对应关系就行了。当然,正所谓特性,肯定还可以定义一些特有的性质,例如在标签中我可以自定义一些Attribute
<input type="checkbox" id="chk1" customizedattr="my attribute" >
在理解了这两个单词的区别之后,在我看来,理想状态下,基本都可以用prop()搞定,除了需要去获取一些自定义的Attribute那就得让attr()出山了。
操作DOM元素Property和Attribute
作为一个对象的属性,按照惯例我们当然可以通过 object.PropertyName的方式来get/set:
var proValue = object.PropertyName;
object.PropertyName = newProValue;
或者
var pValue = object["PropertyName"];
object["PropertyName"] = newValue;
返回值可以是Object类型,返回undefined如果不存在指定的属性名称,
同样,newProValue也可以是一个Object。
而作为对象的特性,经过编译器编译后所有的特性会被存放在一个叫attributes的属性下面,这个属性的类型是NamedNodeMap,如下图所示。
Javascript提供两个方法来进行set/get:
var attrValue = object.getAttribute("AttributeName");
object.setAttribute("AttributeName", newAttrValue);
返回值和newAttrValue都只是string类型,返回null如果不存在指定的特性名称。
jQuery .attr()
如果理解了Property和Attribute的区别以及Javascript的原生操作DOM元素的Attribute的方法的话,那这个.attr()也就不难理解了,jQuery就是把原生的Javascript方法包装一下,提高了跨浏览器的兼容性以及易用性,具体使用方法的话还是参考.attr() api。当然个人还是建议,在.prop()能搞定的地方就不用.attr(),目前能想到的情况:
jQuery 版本 < 1.6
需要设置/获取自定义的特性
jQuery .prop()
根据 John Resig 本人博客所建议,优先选择.prop(),具体使用方法参考.prop() api,原因主要两点:
更合理,更简单
性能稍稍优于.attr()
测试
<div><input type="checkbox" id="chk1" regVal="Test" dataTT="dataTest" myvalue="MyTestValue"><label for="chk1">Monday</label></div>
$(document).ready(function(){
$("input[type=checkbox]").click(function(index){
var domElem = this;
var $Elem = $(this);
$("#resultContainer").append("<pre>domElem[\"class\"] " + domElem["class"] + "</pre>");
$("#resultContainer").append("<pre>domElem[\"className\"] " + domElem["className"] + "</pre>");
$("#resultContainer").append("<pre>domElem.class " + domElem.class + "</pre>");
$("#resultContainer").append("<pre>domElem.className " + domElem.className + "</pre>");
$("#resultContainer").append("<pre>domElem.getAttribute(\"class\") " + domElem.getAttribute("class") + "</pre>");
$("#resultContainer").append("<pre>domElem.getAttribute(\"className\") " + domElem.getAttribute("className") + "</pre>");
$("#resultContainer").append("<pre>$Elem.attr(\"class\") " + $Elem.attr("class") + "</pre>");
$("#resultContainer").append("<pre>$Elem.attr(\"className\") " + $Elem.attr("className") + "</pre>");
$("#resultContainer").append("<pre>$Elem.prop(\"class\") " + $Elem.prop("class") + "</pre>");
$("#resultContainer").append("<pre>$Elem.prop(\"className\") " + $Elem.prop("className") + "</pre>");
$("#resultContainer").append("<pre>*************************************************************************************************************</pre>");
$("#resultContainer").append("<pre>domElem[\"myvalue\"] " + domElem["myvalue"] + "</pre>");
$("#resultContainer").append("<pre>domElem.myvalue " + domElem.myvalue + "</pre>");
$("#resultContainer").append("<pre>domElem.getAttribute(\"myvalue\") " + domElem.getAttribute("myvalue") + "</pre>");
$("#resultContainer").append("<pre>$Elem.attr(\"myvalue\") " + $Elem.attr("myvalue") + "</pre>");
$("#resultContainer").append("<pre>$Elem.prop(\"myvalue\") " + $Elem.prop("myvalue") + "</pre>");
$("#resultContainer").append("<pre>*************************************************************************************************************</pre>");
$("#resultContainer").append("<pre>domElem[\"checked\"] " + domElem["checked"] + "</pre>");
$("#resultContainer").append("<pre>domElem.checked " + domElem.checked + "</pre>");
$("#resultContainer").append("<pre>domElem.getAttribute(\"checked\") " + domElem.getAttribute("checked") + "</pre>");
$("#resultContainer").append("<pre>$Elem.attr(\"checked\") " + $Elem.attr("checked") + "</pre>");
$("#resultContainer").append("<pre>$Elem.prop(\"checked\") " + $Elem.prop("checked") + "</pre>");
$("#resultContainer").append("<pre>*************************************************************************************************************</pre>");
var inputElem = $("input[type=text]")[0];
var $inputElem = $(inputElem);
$("#resultContainer").append("<pre>inputElem[\"value\"] " + inputElem["value"] + "</pre>");
$("#resultContainer").append("<pre>inputElem.value " + inputElem.value + "</pre>");
$("#resultContainer").append("<pre>inputElem.getAttribute(\"value\") " + inputElem.getAttribute("value") + "</pre>");
$("#resultContainer").append("<pre>$inputElem.attr(\"value\") " + $inputElem.attr("value") + "</pre>");
$("#resultContainer").append("<pre>$inputElem.prop(\"value\") " + $inputElem.prop("value") + "</pre>");
});
});
Results:
小结
.attr()和.prop()两个jQuery方法其实都是对Javascript原生方法elem.getAttribute()/elemsetAsttribute()和elem.PropertyName|elem[“PropertyName”]的包装,以支持更好地兼容性和易用性。对于如何选择,jQuery 1.6+的版本中,操作DOM元素的属性时用prop(),操作特性时用attr(),属性和特性若有重叠时,优先使用prop(),例如:id,type,classname等等;对于那些动态的属性,使用prop(),例如:input checkbox 的checked属性,input select 的selected属性,input text 的value属性(这个也推荐使用.val()方法);对于那些自定义的特性,使用attr()。
参考
jQuery .attr() vs. .prop()的更多相关文章
- jquery attr()和prop()方法的区别
$('').attr()返回的是html对象 $('').prop()返回的是DOM对象 attr(): attr() 方法设置或返回被选元素的属性和值. 当该方法用于返回属性值,则返回第一个匹配元素 ...
- [jQuery]attr和prop的区别
转自:http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html 在高版本的jquery引入prop方法后,什么时候 ...
- jquery attr()和prop()方法的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jquery attr与prop的区别与联系
最近开发中发现用attr无法设置checkbox的选中事件,在网上找了下说要用prop,所以总结下两者的区别. 1.操作的对象不同 attr:操作的是HTML文档节点属性 prop:操作的是js对象属 ...
- 稳固而窒息 jquery attr 和 Prop的区别
通常在获取或者设置checked,selected,readonly,disabled等的时候使用prop效果更好 attr是通过setAtrribute和getAttribute来设置的,使用的是D ...
- jquery attr和prop区别
<input type="checkbox" /> <script> $(function() { $('input').click(function() ...
- jQuery attr 与 prop 区别最简单分析
比较经典的解释: 在处理html元素本身就带有的固有属性时,使用prop方法,对于html元素中,我们自己定义的dom属性时,使用attr方法. 而咱自己的理解是: attr会忠实的获取设置dom标签 ...
- jQuery学习之prop和attr的区别示例介绍
1..prop( propertyName ) 获取匹配集合中第一个元素的Property的值 2. .prop( propertyName, value ) .prop( map ) .prop( ...
- jquery中attr()与prop()区别
我们知道jquery中获取元素属性有两种常见的方法,一个是attr()方法,这个是用的比较多的,也是我们第一个想到的.另外一个就是prop()方法了,这个方法之前很少用到,它是jquery1.6之后新 ...
随机推荐
- Mariadb配置Galera集群
一.增加MariaDB源 cd /etc/yum.repos.d vi MariaDB.repo # MariaDB 10.1 CentOS repository list - created 201 ...
- UNIX高级环境编程(16)文件系统 < 雨后 >
来点绿色放松一下眼睛吧 :) 文件系统是对文件和目录的组织集合. 一 设备文件 设备文件和系统的某个设备相对应. 设备驱动程序 处理设备的所有IO请求. 提供了一致的API接口,对应于系统调用的ope ...
- 事务的ACID性质
最近在读黄健宏的<Redis设计与实现>,现在看到了事务这章,由于之前(上学)没有好好整理过数据库事务的四大性质,导致现在(工作)看到了就和第一次知道一样((lll¬ω¬)).还是要把基础 ...
- SDN第五次上机作业--基于组表的简单负载均衡
0.作业链接 http://www.cnblogs.com/easteast/p/8125383.html 1.实验目的 1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 3.抓包分析 ...
- Java多线程学习笔记之一线程基础
1.进程与线程 1.1 进程:是正在运行中的程序的实例,一个运行中idea就是一个进程.进程有它自己的地址空间,一般情况下,包括文本区域(text region).数据区域(data region)和 ...
- express+mysql+vue开发环境搭建
最近开始做一个实验室资产管理系统,后台使用node.js的Express框架,前端使用vue,数据库使用mysql.在这里开始简单记录一下开发过程和遇到的问题. 今天要说的是express+mysql ...
- python面试题(一)
1.通过代码实现如下转换: 二进制转换成十进制:v = “0b1111011” #先将其转换为字符串,再使用int函数,指定进制转换为十进制. print(int("0b1111011&qu ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
- P4279 [SHOI2008]小约翰的游戏
嘟嘟嘟 一道博弈论经典题,nim游戏. 只不过要考虑有奇数个石子为1的堆的时候,为Brother赢.剩下就是nim游戏了. 极简代码 #include<cstdio> using name ...
- Tensorflow Object Detection API 安装
git:https://github.com/tensorflow/models/tree/master/object_detection 中文文档:http://wiki.jikexueyuan.c ...