jQuery获取attr()与prop()属性值的方法及区别介绍


Posted in Javascript onJuly 06, 2016

今天在项目中使用<select></select>下拉菜单时,使用juery操作,使页面加载完菜单默认选中的值为2,我一开始的操作如下:

<!--html部分-->
<select>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
/**js部分**/
$("select").attr("selected","selected");

咋一看好完美,木问题,但是我发现在Safari浏览器中,根本不起作用!!仔细查看一番发现,在Safari浏览器中,属性确实是设置成功了,既value=2的那一项确实是<option value="2" selected="selected">2</option>。那问题出在哪呢?冷静,不要方,万能的stack说只要把attr改成prop就行了,卧槽还真行了,这是啥诡异事件。好吧,我们需要来研究研究了,不用想,肯定是需要祭出官方文档了。

1.attr() : 获取匹配的元素集合中的第一个元素的属性的值 或 设置每一个匹配元素的一个或多个属性。 •.attr( attributeName ) •.attr( attributeName )

•.attr( attributeName, value ) •.attr( attributeName, value )
•.attr( attributes )
•.attr( attributeName, function(index, attr) )

2.prop() : 获取匹配的元素集中第一个元素的属性(property)值或设置每一个匹配元素的一个或多个属性。 •.prop( propertyName ) •.prop( propertyName )

•.prop( propertyName, value ) •.prop( propertyName, value )
•.prop( properties )
•.prop( propertyName, function(index, oldPropertyValue) )

看出区别了吗,没错,是参数有区别,attr()传入的是attributeName,而prop()传入的是propertyName,现在我们的问题转移了,我们需要研究的是attributeName和propertyName之间的区别了。

Attributes vs. Properties

在这里,我们可以将attribute理解为“特性”,property理解为为“属性”从而来区分俩者的差异。
如果把DOM元素看成是一个普通的Object对象,这个对象在其定义时就具有一些属性(property),比如把select的option当做一个对象:

var option = {
selected:false,
disabled:false,
attributes:[],
...
}

现在,我们一目了然了,attribute是一个特性节点,每个DOM元素都有一个对应的attributes属性来存放所有的attribute节点,它是一个类数组的容器。attributes的每个数字索引以名值对(name=”value”)的形式存放了一个attribute节点。而property就是一个属性,是一个以名值对(name=”value”)的形式存放在Object中的属性。

回到一开始的问题,根据W3C的表单规范 ,在selected属性(property)是一个布尔属性, 这意味着,如果这个特性(attribute)存在, 即使该特性没有对应的值,或者被设置为空字符串值,或甚至是"false",相应的属性(property)都还是为true。 selected特性(attribute)值不会因为复选框的状态而改变,而selected属性(property)会因为复选框的状态而改变。因此,跨浏览器兼容的检索和更改DOM属性,比如元素的checked, selected, 或 disabled状态,请使用.prop()方法。

jquery中attr和prop的区别介绍

在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了。

关于它们两个的区别,网上的答案很多。这里谈谈我的心得,我的心得很简单:

 •对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。

•对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

上面的描述也许有点模糊,举几个例子就知道了。 

<a href="http://www.baidu.com" target="_self" class="btn">百度</a>

这个例子里<a>元素的DOM属性有“href、target和class",这些属性就是<a>元素本身就带有的属性,也是W3C标准里就包含有这几个属性,或者说在IDE里能够智能提示出的属性,这些就叫做固有属性。处理这些属性时,建议使用prop方法。

<a href="#" id="link1" action="delete">删除</a>

这个例子里<a>元素的DOM属性有“href、id和action”,很明显,前两个是固有属性,而后面一个“action”属性是我们自己自定义上去的,<a>元素本身是没有这个属性的。这种就是自定义的DOM属性。处理这些属性时,建议使用attr方法。使用prop方法取值和设置属性值时,都会返回undefined值。

再举一个例子:

<input id="chk1" type="checkbox" />是否可见<input id="chk2" type="checkbox" checked="checked" />是否可见

像checkbox,radio和select这样的元素,选中属性对应“checked”和“selected”,这些也属于固有属性,因此需要使用prop方法去操作才能获得正确的结果。

$("#chk1").prop("checked") == false
$("#chk2").prop("checked") == true

如果上面使用attr方法,则会出现:

$("#chk1").attr("checked") == undefined
$("#chk2").attr("checked") == "checked"
Javascript 相关文章推荐
网页和浏览器兼容性问题汇总(draft1)
Jun 01 Javascript
setinterval()与clearInterval()JS函数的调用方法
Jan 21 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
Nov 19 Javascript
require.js配合插件text.js实现最简单的单页应用程序
Jul 12 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
javascript中的深复制详解及实例分析
Dec 29 Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
jQuery插件simplePagination的使用方法示例
Apr 28 jQuery
jQuery实现的分页插件完整示例
May 26 jQuery
jQuery+ajax实现实用的点赞插件代码
Jul 06 #Javascript
jQuery操作iframe中js函数的方法小结
Jul 06 #Javascript
jQuery深拷贝Json对象简单示例
Jul 06 #Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 #Javascript
JS如何判断json是否为空
Jul 06 #Javascript
移动端 一个简单易懂的弹出框
Jul 06 #Javascript
Bootstrap选项卡与Masonry插件的完美结合
Jul 06 #Javascript
You might like
PHP编程网上资源导航
2006/10/09 PHP
如何对PHP程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
残疾人创业典型事迹
2014/02/01 职场文书
初中同学聚会感言
2014/02/11 职场文书
投标承诺书范本
2014/03/27 职场文书
历史学专业求职信
2014/06/19 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
团组织推荐意见
2015/06/05 职场文书
警示教育观后感
2015/06/17 职场文书
严以律己学习心得体会
2016/01/13 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android