jQuery中.attr()和.prop()的区别
之前学习jQuery的时候,学习到了两种取得标签的属性值的方法:一种是elemJobj.attr(),另一种是elemJobj.prop()。而在学习JS的时候,只有一种方法elemObj.getAttribute()。刚开始知道这两个jQuery方法都可以取得元素的属性值的时候,我觉得很奇怪,以为随着jQuery版本更新造成的历史遗留方法,所以花时间查了查attribute和property的区别,发现原来这两个其实是有区别的。其间我主要参考了这两篇文章:
JavaScript中的property和attribute介绍--脚本之家
jquery中attr和prop的区别--〖芈老头〗的技术空间
- property
property是元素的固有属性,本身就拥有的,是写在HTML标准里的元素的属性。
- attribute
attribute是我们自己定义的元素的属性,是没写在HTML标注中的,而是我们需要的时候自己进行定义的。
在了解了这两点的前提下,就可以对jQuery里的这两种方法的区别进行探讨了。对于元素本身固有的属性,我们应该用elemJobj.prop()方法进行取值,这样才能得到所需属性的正确值/计算值,特别在"值不是字符串类型而是布尔型"并且"采用简写形式的属性"时,如果采用.attr()方法,将得到undefined,而不是属性的布尔值。而采用elemJobj.attr()方法,我们会获得属性的字面量。
引用〖芈老头〗老师的例子:
<input id="input1" type="checkbox">
<input id="input2" type="checkbox" checked="checked">
在这个例子中,如果使用elemJobj.prop()方法,会得到如下结果:
$("#input1").prop("checked"); //false
$("#input2").prop("checked"); //true
而如果使用elemJobj.attr()方法,会得到如下结果:
$("#input1").attr("checked"); //undefined
$("#input2").attr("checked"); //checked
//补充说明:如果input2的checked属性是简写的形式,结果也与上面测试的结果是一样的,因为浏览器会给简写形式默认的值
由此可见,读取固有属性,应该使用.prop()方法,而不该使用.attr()方法。相对应地,读取自定义的属性就正好相反。
深度扩展:
在"脚本之家"的文章中,讲到了在JS中对属性进行点操作和JS方法操作时候所遇到的一些问题,这篇文章的作者不知道是哪位大神,但是可以感受到这位大神处理问题的认真态度,从这篇文章中可以很深入地了解这两个“属性”之间的区别,在这里我简单地把这篇文章做一个记录。
文章开头从语义上,表明attribute是property的子集,(对于这个观点,我并不确定,所以保持怀疑态度,因为我理解的property是固有属性,attribute是自定义属性,它们是不同的集合)而在JavaScript中,property和attribute更是有明显的区别。我们用代码来说明区别在哪:
---attribute
//HTML
<div id="div1">This is a test division.</div>
<div id="div2">This is a test division.</div>
如果对这个元素的自定义属性"myAttr"进行操作:
var elem1=document.getElementById("div1");
elem1.setAttribute("myAttr","testAttr");
alert(elem1.getAttribute("myAttr")); //testAttr
alert(elem1.myAttr); //undefined
var elem2=document.getElementById("div2");
elem2.myAttr = "testAttr";
alert(elem2.getAttribute("myAttr")); //null,没有设置上
alert(elem2.myAttr); //testAttr
//查看DOM可以发现,使用点操作给元素赋的值并没有写进元素的属性中,只是在点操作读取的时候可以都出来
在这里我们可以看出来,似乎setAttribute()和getAttribute()成了一对CP,而点操作必须自己跟自己玩儿。用文中的一句话就是:在对自定义属性的处理方式上,DOM属性的标准方法和点号方法不再具有任何关联性。
---property
//HTML
<a id="a1" href="">This is a test element.</a>
<a id="a2" href="">This is a test element.</a>
如果对这两个元素的属性"href"进行操作:
var elem1=document.getElementById("a1");
elem1.setAttribute("href","testProp");
alert(elem1.getAttribute("href")); //testAttr
alert(elem1.href); //path/testProp
var elem2=document.getElementById("a2");
elem2.href = "testProp";
alert(elem2.getAttribute("href")); //testAttr
alert(elem2.href); //path/testProp
两组alert的结果是一样的,两个方法都能够将属性值设置进DOM中,.getAttribute()方法返回的是文件路径字面量(相对路径),而点操作则是返回的计算值,是指定的文件的绝对路径。由此可以猜测的是,对于元素的固有属性property,DOM标准方法和点操作是相通的。
之后,我又对两个<div>的class属性进行了测试,发现结果和进行attribute测试的结果一样,结合脚本之家的这篇文章,可能只有href, src, value这几个属性是固有属性里面DOM方法操作和点操作相通的吧,具体原因现在还不是很懂。
结语:(一)对于jQuery中方法的使用,固有属性就该用.prop(),而自定义属性就该用.attr();(二)而在JS中,虽然property和attribute有一点混乱了,但仍然可以保持property和attribute分别是固有属性和自定义属性的这个观点,这样区别开来不容易造成混淆,同时为了避免bug的出现,还是尽量在使用的时候,.setAttribute()和.getAttribute()相对应,点操作与点操作对应,不把DOM方法和点操作混着用(即使有时候是相通的),这样可以避免错误的产生。(三)在涉及到href, src, value这三个属性的计算值(绝对路径)的时候,用点操作。
jQuery中.attr()和.prop()的区别的更多相关文章
- jquery中attr和prop的区别、 什么时候用 attr 什么时候用 prop (转自 芈老头 )
jquery中attr和prop的区别. 什么时候用 attr 什么时候用 prop 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这 ...
- jquery中attr和prop的区别(转)
在网络上看到这样一篇关于jquery中attr和prop的区别文章,觉得不错,所以转载了. 在jQuery 1.6中,.attr()方法查询那些没有设置的属性,则会返回一个undefined.如果你要 ...
- jquery中attr和prop的区别分析
这篇文章主要介绍了jquery中attr和prop的区别分析的相关资料,需要的朋友可以参考下 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别 ...
- Jquery学习笔记(6)--jquery中attr和prop的区别【精辟】
jquery中attr和prop的区别 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了. 关于它们两个的区别,网上的答案很 ...
- Jquery中attr 和 prop的区别和联系
昨天在选择借款方类型的时候总是会出现选择要点两次的现象,比如点击公司,第一次点击选择公司,没有选中,必须在次点击才可以选中,总感觉是有点延迟加载的意思,后来审查元素, 发现是redio元素,这样的话就 ...
- jquery中attr与prop的区别
先从一个老生常谈的问题说起,使用jquery实现全选全不选.楼主先使用的jquery版本是 jquery-1.11.1.min.js 全选<input type="checkbox&q ...
- Jquery中attr()与prop()的区别
在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同.但是,这两个函数的用处却并不相同.下面我们来详细介绍这两个函数之间的区别. 1.操作对象 ...
- jQuery中 attr和Prop的区别
出自这里: http://www.365mini.com/page/jquery_noconflict.htm 在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参 ...
- jquery 中 attr 和 prop 的区别
问题:在jQuery引入prop方法后,什么时候使用attr,什么时候使用prop,两者区别. 判断: 对于HTML元素本身所有的固有属性,在处理的时候,使用prop方法 对于HTML元素后来我们自己 ...
随机推荐
- 基础_ _返回键back
============ 2, android中的back键处理 很多网友不明白,如何在Android平台上捕获Back键的事件. Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序 ...
- Spark Streaming、Kafka结合Spark JDBC External DataSouces处理案例
场景:使用Spark Streaming接收Kafka发送过来的数据与关系型数据库中的表进行相关的查询操作: Kafka发送过来的数据格式为:id.name.cityId,分隔符为tab zhangs ...
- Linux 账户信息显示和实现账户安全
一.账户信息显示 1.groups命令 使用groups命令可以显示指定用户账户的组群成员身份. [root@redhat2 ~]# groups --help Usage: groups [OPTI ...
- adb命令安装apk,和安装问题daemon not running. starting it now on port 5037解决
通过手机测试手机上的客户端应用,一般需要先安装被测应用apk到手机中,安装步骤如下: [预置条件] 1.通过PC的"开始",在运行框中输入cmd,回车,打开cmd编辑界面: 2.手 ...
- 初始化成员列表 ——— 类的const成员和引用成员的初始化
class A { public: A(){}; const int num; CString& s; } A::A() { cout<<A con<<endl; } ...
- 纸上谈兵:AVL树
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点 ...
- [winserver]设置Server2008R2远程桌面允许每个用户运行多个会话
首先打开"服务器管理器",选择"角色"-在对话框右边部分选择"添加角色" 根据提示一步步安装即可. 然后在角色中找到"远程桌面服务 ...
- c++ primer 5th 练习3.43
#include <iostream> using namespace std; int main() { ][]={,,,,,,,,,,,}; /* for(int (&i)[4 ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- maximo功能修改(初步理解)
已接触IBM公司的MAXIMO近三个月,在这时间里自己对maximo也有所了解,今天将自己总结写在这里,方便自己的温习和大家的参考,不足之处还望指出,我一定在第一时间内修改. 今天在公司所做的就是完善 ...