JS中attr和prop属性的区别以及优先选择示例介绍


Posted in Javascript onJune 30, 2014

相比attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和properties)。只是,window或document中使用.attr()方法在jQuery1.6之前不能正常运行,因为window和document中不能有attributes。prop应运而生了。

既然我们想知道他们两的区别,最好就看看他们的源代码,不要被代码长度所吓到,我们只看关键的几句:

attr: function( elem, name, value, pass ) { 
var ret, hooks, notxml, 
nType = elem.nodeType; 
// don't get/set attributes on text, comment and attribute nodes 
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 
return; 
} 
if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) { 
return jQuery( elem )[ name ]( value ); 
} 
// Fallback to prop when attributes are not supported 
if ( typeof elem.getAttribute === "undefined" ) { 
return jQuery.prop( elem, name, value ); 
} 
notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 
// All attributes are lowercase 
// Grab necessary hook if one is defined 
if ( notxml ) { 
name = name.toLowerCase(); 
hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); 
} 
if ( value !== undefined ) { 
if ( value === null ) { 
jQuery.removeAttr( elem, name ); 
return; 
} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { 
return ret; 
} else { 
elem.setAttribute( name, value + "" ); 
return value; 
} 
} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { 
return ret; 
} else { 
ret = elem.getAttribute( name ); 
// Non-existent attributes return null, we normalize to undefined 
return ret === null ? 
undefined : 
ret; 
} 
}

prop方法代码(jQuery版本1.8.3)

prop: function( elem, name, value ) { 
var ret, hooks, notxml, 
nType = elem.nodeType; 
// don't get/set properties on text, comment and attribute nodes 
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 
return; 
} 
notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 
if ( notxml ) { 
// Fix name and attach hooks 
name = jQuery.propFix[ name ] || name; 
hooks = jQuery.propHooks[ name ]; 
} 
if ( value !== undefined ) { 
if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { 
return ret; 
} else { 
return ( elem[ name ] = value ); 
} 
} else { 
if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { 
return ret; 
} else { 
return elem[ name ]; 
} 
} 
}

attr方法里面,最关键的两行代码,elem.setAttribute( name, value + “” )和ret = elem.getAttribute( name ),很明显的看出来,使用的DOM的API setAttribute和getAttribute方法操作的属性元素节点。
而prop方法里面,最关键的两行代码,return ( elem[ name ] = value )和return elem[ name ],你可以理解成这样document.getElementById(el)[name] = value,这是转化成JS对象的一个属性。

既然明白了原理是这样,我们来看看一个例子:

<input type="checkbox" id="test" abc="111" />
$(function(){ 
el = $("#test"); 
console.log(el.attr("style")); //undefined 
console.log(el.prop("style")); //CSSStyleDeclaration对象 
console.log(document.getElementById("test").style); //CSSStyleDeclaration对象 
});

el.attr(“style”)输出undefined,因为attr是获取的这个对象属性节点的值,很显然此时没有这个属性节点,自然输出undefined
el.prop(“style”)输出CSSStyleDeclaration对象,对于一个DOM对象,是具有原生的style对象属性的,所以输出了style对象
至于document.getElementById(“test”).style和上面那条一样

接着看:

el.attr("abc","111") 
console.log(el.attr("abc")); //111 
console.log(el.prop("abc")); //undefined

首先用attr方法给这个对象添加abc节点属性,值为111,可以看到html的结构也变了

el.attr(“abc”)输出结果为111,再正常不过了
el.prop(“abc”)输出undefined,因为abc是在这个的属性节点中,所以通过prop是取不到的

el.prop("abc", "222"); 
console.log(el.attr("abc")); //111 
console.log(el.prop("abc")); //222

我们再用prop方法给这个对象设置了abc属性,值为222,可以看到html的结构是没有变化的。输出的结果就不解释了。

上面已经把原理讲清楚了,什么时候用什么就可以自己把握了。

提一下,在遇到要获取或设置checked,selected,readonly和disabled等属性时,用prop方法显然更好,比如像下面这样:

<input type="checkbox" id="test" checked="checked" />
console.log(el.attr("checked")); //checked 
console.log(el.prop("checked")); //true 
console.log(el.attr("disabled")); //undefined 
console.log(el.prop("disabled")); //false

显然,布尔值比字符串值让接下来的处理更合理。

PS一下,如果你有JS性能洁癖的话,显然prop的性能更高,因为attr需要访问DOM属性节点,访问DOM是最耗时的。这种情况适用于多选项全选和反选的情况。

大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = "disabled",checked="checked",比如用attr("checked")获取checkbox的checked属性时选中的时候可以取到值,值为"checked"但没选中获取值就是undefined。

jq提供新的方法“prop”来获取这些属性,就是来解决这个问题的,以前我们使用attr获取checked属性时返回"checked"和"",现在使用prop方法获取属性则统一返回true和false。

那么,什么时候使用attr(),什么时候使用prop()?
1.添加属性名称该属性就会生效应该使用prop();
2.是有true,false两个属性使用prop();
3.其他则使用attr();
项目中jquery升级的时候大家要注意这点!

以下是官方建议attr(),prop()的使用:

以下是官方建议attr(),prop()的使用:

JS中attr和prop属性的区别以及优先选择示例介绍

Javascript 相关文章推荐
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 Javascript
屏蔽相应键盘按钮操作
Mar 10 Javascript
extjs_02_grid显示本地数据、显示跨域数据
Jun 23 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
javascript基本常用排序算法解析
Sep 27 Javascript
什么是Vue.js框架 为什么选择它?
Oct 17 Javascript
vue项目中应用ueditor自定义上传按钮功能
Apr 27 Javascript
js实现全选和全不选
Jul 28 Javascript
使用JS前端技术实现静态图片局部流动效果
Aug 05 Javascript
Visual Studio中js调试的方法图解
Jun 30 #Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
Jun 30 #Javascript
js从Cookies里面取值的简单实现
Jun 30 #Javascript
jQuery学习总结之jQuery事件
Jun 30 #Javascript
JavaScript 获取任一float型小数点后两位的小数
Jun 30 #Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
Jun 30 #Javascript
jquery实现人性化的有选择性禁用鼠标右键
Jun 30 #Javascript
You might like
第六节 访问属性和方法 [6]
2006/10/09 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
各种快递查询--Api接口
2016/04/26 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python脚本实现自动发带图的微博
2016/04/27 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
Python将string转换到float的实例方法
2019/07/29 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
班级出游活动计划书
2014/08/15 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
地震慰问信
2015/02/14 职场文书
总经理检讨书范文
2015/02/16 职场文书
培根随笔读书笔记
2015/07/01 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
SQL Server中锁的用法
2022/05/20 SQL Server
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS