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 相关文章推荐
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
AngularJS延迟加载html template
Jul 27 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
Aug 11 Javascript
深入学习Bootstrap表单
Dec 13 Javascript
JS实现的表头列头固定页面功能示例
Jan 10 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 Javascript
javascript实现数据双向绑定的三种方式小结
Mar 09 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
浅谈JS函数节流防抖
Oct 18 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
May 01 Javascript
详解Angular模板引用变量及其作用域
Nov 23 Javascript
jquery.pager.js分页实现详解
Jul 29 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开发者的10个技巧
2011/02/25 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
python条件和循环的使用方法
2013/11/01 Python
Python函数参数类型*、**的区别
2015/04/11 Python
python创建进程fork用法
2015/06/04 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
Python多线程正确用法实例解析
2020/05/30 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
C#面试常见问题
2013/02/25 面试题
质检部岗位职责
2013/11/11 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python