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 相关文章推荐
javascript中this做事件参数相关问题解答
Mar 17 Javascript
js利用数组length属性清空和截短数组的小例子
Jan 15 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
Jan 04 Javascript
vue中SPA单页面应用程序详解
Nov 07 Javascript
微信小程序左右滑动的实现代码
Dec 15 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
基于vue-upload-component封装一个图片上传组件的示例
Oct 16 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 Javascript
js验证身份证号码记录的方法
Apr 26 Javascript
vue+element 模态框表格形式的可编辑表单实现
Jun 07 Javascript
jQuery操作元素追加内容示例
Jan 10 jQuery
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 Javascript
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 array_merge下进行数组合并的代码
2008/07/22 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
mysql总结之explain
2012/02/27 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
Python之多进程与多线程的使用
2021/02/23 Python
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
司机检讨书
2014/02/13 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android