jquery中attr方法和prop方法的区别
关于checked
的属性,最重要的概念就是你要记住,它跟checked
的状态值是毫无关系的,设置checked = "checked"
或者checked = "true"
等属性设置,和它的状态值true/false
是无关的。,而这里的属性值,事实上只是和defaultChecked
的状态值有关,并且只能用来设置checkbox
的初始的值。checked
的属性值并不会随着checkbox
的的状态变化而变化,可是checkbox
的状态值却会。因此,为了能更好的跨浏览器的兼容,决定了checkbox
的checked
的状态要使用状态值进行处理。
例如:
if(elem.checked)
if($(elem).prop("checked"))
if($(elem).is(":checked"))
这些理论,对于那些动态的属性来说,效果是相同的,例如:selected
和value
属性。
attr() 方法设置或返回被选元素的属性值。
根据该方法不同的参数,其工作方式也有所差异。
返回被选元素的属性值。
prop() 方法设置或返回被选元素的属性和值。
当该方法用于返回属性值时,则返回第一个匹配元素的值。
当该方法用于设置属性值时,则为匹配元素集合设置一个或多个属性/值对。
注意:prop() 方法应该用于检索属性值,例如 DOM 属性(如 selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, 和 defaultSelected)。
提示:如需检索 HTML 属性,请使用 attr() 方法代替。
提示:如需移除属性,请使用 removeProp() 方法。
jQuery中,用于获取属性的方法,主要是基于prop
方法的,我们经常使用的是attr方法,不过在attr
方法中,有时候会出现一些问题的,这里就看下jquery的API中attr
的介绍,主要内容翻译自jQuery的API介绍:attr()
1.基本使用方法
attr()
的作用:获取匹配到的第一个元素的一个属性值,或者是为所有匹配的元素进行属性赋值。
支持的方法:
.attr(attributeName)
- 获取匹配到的第一个元素的一个属性值。
- 输入值attributeName
- Type:String,需要获取的属性名称
.attr()
方法,只能获取匹配到的第一个元素的值,如果你想要获取匹配到的所有的元素的属性值,那么就需要借助jquery中的循环的方法,比如:.each()
和.map()
;
使用jQuery的.attr()
方法,获取元素的属性值有两个最重要的优势:
1:使用简单,它可以直接对一个jQuery对象使用,并且使用过之后可以继续使用其他的jQuery方法。
2:跨浏览器兼容性,有些属性的获取方法在浏览器上不兼容的,甚至于有的在同一浏览器的不同版本之间,都会出现不兼容的问题,.attr()方法降低了这种不兼容性。
在jQuery 1.6中,.attr()
方法查询那些没有设置的属性,则会返回一个undefined。如果你要去恢复或者改变DOM状态值,类似checked
,selected
,disabled
等表单元素的状态,最好使用.prop()
方法。
属性值 VS 状态值
在一些特殊的情况下,属性值和状态值的不同是有很大影响的。在jQuery 1.6之前的版本,.attr()
方法在恢复一些属性时,有时会把状态值也考虑进去,这样的话,就会导致浏览器的兼容问题。在jQuery 1.6中,.prop()
提供的方法可以避免恢复状态值,而.attr()
方法会恢复状态值。
例如:selectedIndex
, tagName
, nodeName
, nodeType
, ownerDocument
, defaultChecked
,和defaultSelected
这些属性,就应该使用.prop()
方法进行恢复属性值。在jQuery 1.6之前的版本,这些状态值都是可以通过.attr()
获取的,虽然获取这些状态值并不是attr
的工作范围。这些个状态值和属性是没有任何联系的,它们仅仅是一个状态。
就布尔逻辑型的属性而言,如果我们定义一个这样的HTML的DOM对象。<input type = "checkbox" checked = "checked" />
,并且假设这个HTML
对象在Javascript
中被命名为elem
.
看一下它们的使用不同方法对checked
属性取值的结果显示:

根据W3C的规范,“checked”
属性,是一个布尔逻辑型的属性,这就意味着,如果该属性存在的话,那么它对应的状态值的取值结果是正确的,例如,即使该属性没有值,或者被设置成一个空字符串,或者设置为“false”
,对于布尔逻辑型属性来说都是正确的。
然而,关于checked
的属性,最重要的概念就是你要记住,它跟checked
的状态值是毫无关系的,设置checked = "checked"
或者checked = "true"
等属性设置,和它的状态值true/false
是无关的。,而这里的属性值,事实上只是和defaultChecked
的状态值有关,并且只能用来设置checkbox
的初始的值。checked
的属性值并不会随着checkbox
的的状态变化而变化,可是checkbox
的状态值却会。因此,为了能更好的跨浏览器的兼容,决定了checkbox
的checked
的状态要使用状态值进行处理。
例如:
if(elem.checked)
if($(elem).prop("checked"))
if($(elem).is(":checked"))
这些理论,对于那些动态的属性来说,效果是相同的,例如:selected
和value
属性。
补充注释:
在IE9之前的浏览器版本中,使用.prop()
方法,设置一个DOM
元素的状态值,相较于那些原始的值(数字,字符串,或者布尔逻辑值)是不同的,如果这个DOM
元素在被移除文档之前,没有使用.removeProp()
移除这个状态值,那么它将会导致内存泄露,如果想要比较安全的在DOM
对象上面设置属性值,而又不会导致内存泄露,那么使用.data
这句话,没有理解到
举例:核心代码如下
<body>
<input id="check1" type="checkbox" checked="checked">
<label for="check1">Check me</label>
<p></p>
<script>
$( "input" )
.change(function() {
var $input = $( this );
$( "p" ).html( ".attr( 'checked' ): <b>" + $input.attr( "checked" )
+ "</b><br>" +".prop( 'checked' ): <b>" + $input.prop( "checked" )
+ "</b><br>" +".is( ':checked' ): <b>" + $input.is( ":checked" )
+ "</b>" );}).change();
</script>
查看原页面代码,可以点击:attr-prop;
这里就不再举例说明attr
的正常使用方法了,如果你有兴趣,可以点击查看:实例demo
2:使用attr进行赋值操作。
.attr(attributeName,name)
- attributeName:String,需要设置的属性名称
- String or Number, 需要设置的属性的属性值。
.attr(attributes)
- attributes:Object, 需要设置的属性组成的一个对象。
.attr(attributeName,function(index,attr))
- attributeName:String, 设置的属性名称。
- function(index,attr):Function,
函数的返回值设置为属性的值,this
表示当前选中的元素,接收的第一个参数是表示,当前选中的元素中的位置的序列(从0开始),第二个参数为该元素,对于该属性的原来的属性值。
使用.attr()
方法去设置属性值是非常方便的,尤其是需要设置多个属性,或者需要设置的属性值是一个function
的返回值时,看下面的image
标签:
<img id="greatphoto" src="brush-seller.jpg" alt="brush seller"\>
设置一个简单的属性,使用.attr()
可以简单的根据属性名和属性值的改变alt属性的值。
$( "#greatphoto" ).attr( "alt", "Beijing Brush Seller" );
也可以使用同样的方法,添加一个新的属性:
$( "#greatphoto" ).attr( "title", "Photo by Kelly Clark" );
也可以一次设置多个属性:改变属性alt
的值,同时添加新的属性title
。
$( “#greatphoto” ).attr({
alt: “Beijing Brush Seller”,
title: “photo by Kelly Clark”
});
当设置多个属性时,属性名的引号是可以省略的。
<input>
和<button>
元素的type
属性,如果强制去改变,在任何浏览器下,这都会抛出一个异常,这是因为,在IE浏览器下,type
属性是不可被修改的。所以就在所有的浏览器下,都不能进行设置,保存兼容性的统一。 计算后的属性值:
通过使用function
设置属性,可以通过其他的属性值进行计算之后,再进行属性赋值操作,例如:基于一个已有的属性连接处一个新的属性值。
$( “#greatphoto” ).attr( “title”, function( i, val ) {
return val + ” – photo by Kelly Clark”;
});
这种通过function
计算属性值的方法在一次性对多个元素设置不同的属性值时,尤其的有效。
例子:为页面中的所有img设置一些属性,核心代码如下:
<body>
<img>
<img>
<img>
<div><b>Attribute of Ajax</b></div>
<script>
$( "img" ).attr({
src: "/resources/hat.gif",
title: "jQuery",
alt: "jQuery Logo"
});
$( "div" ).text( $( "img" ).attr( "alt" ) );
</script>
</body>
根据div在页面中的position,设置它的id属性。
<body>
<div>Zero-th <span></div>
<div>First <span></span></div>
<div>Second <span></span></div>
<script>
$( "div" )
.attr( "id", function( arr ) {
return "div-id" + arr;
})
.each(function() {
$( "span", this ).html( "(id = '<b>" + this.id + "</b>')" );
});
</script>
</body>
OK,这里就暂时叙述到这里了,如果你不明白为什么.attr()
的取值和.prop()
的取值有这个差别,那么就先看看前一篇文章,js原生操作HTML对象的属性区别,然后再去看看jquery
源码中的,.attr()
方法和.prop()
方法的实现吧。
jquery中attr方法和prop方法的区别的更多相关文章
- jquery里的attr()方法和prop()方法的区别
在jq的高版本里出现了prop()方法,那么attr()和prop()的区别在哪呢?这两者分别在什么情况用呢? 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们 ...
- jquery attr方法和prop方法获取input的checked属性问题
jquery attr方法和prop方法获取input的checked属性问题 问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法 ...
- js进阶 12-13 jquery中one方法和trigger方法如何使用
js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...
- ExtJS中listener方法和handler方法的区别
listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...
- 浅析jquery中attr属性和prop属性的区别
最近在做项目的时候,发现到了prop这个属性,然后之前一直使用的是attr属性,觉得感觉上都差不多,jQuery也不可能专门做了两个相同的属性撒.所以就结合这两个属性研究了一下,也谈谈我对他们最简单最 ...
- java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...
- Thinkphp中D方法和M方法的区别
两者共同点都是实例化模型的,而两者不同点呢?一起来看一下: $User = D('User');括号中的参数User,对应的模型类文件的 \Home\Model\UserModel.class.php ...
- 关于jQuery——attr方法和prop方法获取input的checked属性操作
经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性,获取 ...
- jQuery中bind方法和live方法区别解析
Javascript中的事件有它的独特性,有默认的执行事件,例如冒泡就是其中的一个.在很多比较复杂的应用程序中,停止事件的冒泡或捕获在程序开发当中是十分有用的,而在IE中有它的独特方式来阻止事件的冒泡 ...
随机推荐
- JS 提取公式中的参数
'A+B-C/D*E'.split(/[*/()+-]/) => [A,B,C,D,E]
- laravel 向多视图及所有视图传递数据变量
向单个视图传递变量 1.使用with()方法 : view('user.lists')->with('title',$title); 2.直接view()传参: view('user.lists ...
- HDU 1205 吃糖果 (鸽巢原理)
题目链接:HDU 1205 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢 ...
- cita 源码研究
适用环境 vim + YouCompleteMe 使用 github 源,不能使用 ustc 源 git clone --depth 1 --recusive https://github.com/k ...
- Redis 系列
Redis 系列 [Redis 系列(01)安装配制] [Redis 系列(02)数据结构] [Redis 系列(03-1)进阶 - 发布订阅] [Redis 系列(03-2)进阶 - 事务] [Re ...
- [fw]IDT表的初始化
IDT表的初始化 linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((_ ...
- MyEclipse配置maven创建项目教程入门
Maven简介:Maven是一个项目管理工具,主要用于Java平台的项目构建.依赖管理和项目生命周期管理. 下载Maven: https://maven.apache.org/download.cgi ...
- 记录Angular2.0学习遇到的问题
最近开始学习Angular2.0,准备持续记录下踩过得坑 1如何读取本地json文件: 需要通过http请求读取本地json文件,数据文件要放在assets文件夹下面 Service中的代码如下: ...
- 【记录】Mysql 建表注意事项
博主最近打算搭建商城,由于之前对建表只有很浅显的理解,没有太过深入了解,建表过程中遇到一些问题,现记录如下, 如有问题请各位留言指正,感激不尽: 建表时设置如何设置联合主键?如下标红处: CREATE ...
- go语言从例子开始之Example21.协程
Go 协程 在执行上来说是轻量级的线程. golang使用协程用go关键字.后边正常调用函数. Example: package main import "fmt" func ak ...