jQuery的attr与prop使用介绍


Posted in Javascript onOctober 10, 2013

attribute与property

attribute和property都可以翻译为属性,为了以示区别,通常把这两个单词翻译为属性与特性。

<div id="test">Click Here</div>

上面这段HTML语句中有三个节点,分别是Element “div”、attribute “id”、Text “click here”,我们最常见的attribute正式指的attribute类型节点,在JavaScript有专门处理attribute的函数 .getAttribute(name) / setAttribute(name,value)。当然attribute不只是我们能够在HTML文档上看到的这几个,我们可以自定义attributed加到DOM节点中

<div id="test">123</div>    <script type="text/javascript">
        var t=document.getElementById('test');
        t.setAttribute('class','active');
        t.setAttribute('customizedAttr','customized');
    </script>

这样可以div被修改为

<div id="test" class="active" customizedattr="customized">123</div>

通过方法 setAttribute设置的attribute最终都会反映到元素的attribute类型的节点中

property是DOM对象的字段,跟我们平常使用的一些对象一样,包含很多字段,这些字段就是property,取值或者设置值和普通字段一样通过”对象.字段“的方式。

看起来attribute和property应该没有什么关系才对,怎么会。。。attribute和property容易混?x是因为很多attribute节点还有一个相对应的property属性,比如上面div的”id“ attribute 同样可以用t.id取到(实际上绝大部分人都是这样获取的),通过property更改id后,用getAttibute获取的id是更新后的id。

t.id='test1';
console.log(t.getAttribute('id'));//test1

同样我们也可以自定义property

t.customizedProp='customized prop';

区别

1. 于build-in属性,attribute和property共享数据,attribute更改了会对property造成影响,反之亦然,但是两者的自定义属性是独立的数据,即使name一样,也互不影响,看起来是下面这张图,但是IE6、7没有作区分,依然共享自定义属性数据

jQuery的attr与prop使用介绍

2. 并不是所有的attribute与对应的property名字都一致,比如刚才使用的attribute 的class属性,使用property操作的时候应该是这样className

t.className='active2';

3. 对于值是true/false的property,类似于input的checked attribute等,attribute取得值是HTML文档字面量值,property是取得计算结果,property改变并不影响attribute字面量,但attribute改变会一向property计算

<input id="test3" type="checkbox"/>
var t=document.getElementById('test3');
        console.log(t.getAttribute('checked'));//null
        console.log(t.checked);//false;        t.setAttribute('checked','checked');
        console.log(t.getAttribute('checked'));//checked
        console.log(t.checked);//true
        t.checked=false;
        console.log(t.getAttribute('checked'));//checked
        console.log(t.checked);//false

4. 对于一些和路径相关的属性,两者取得值也不尽相同,但是同样attribute取得是字面量,property取得是计算后的完整路径

<a id="test4" href="#">Click</a>

var t=document.getElementById('test4');
        console.log(t.getAttribute('href'));//#
        console.log(t.href);//file:///C:/Users/bsun/Desktop/ss/anonymous.html#

关于浏览器(IE)造成的兼容性问题可以看看IE 混淆了 DOM 对象属性(property)及 HTML 标签属性(attribute),造成了对 setAttribute、getAttribute 的不正确实现

attr和prop

相信看完上面内容,大家就明白为什么jQuery要添加prop方法了,在jQuery API中也有专门解释

Attributes VS. Properties

在一些特殊的情况下,attributes和properties的区别非常大。在jQuery1.6之前,.attr()方法在获取一些attributes的时候使用了property值,这样会导致一些不一致的行为。在jQuery1.6中,.prop()方法提供了一中明确的获取property值得方式,这样.attr()方法仅返回attributes。

比如,selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, 和defaultSelected应该使用.prop()方法获取/设置值。 在jQuery1.6之前这些不属于attribute的property需要用.attr()方法获取。这几个并没有相应的attibute,只有property。

关于布尔类型 attributes,比如一个这样的HTML标签,它在JavaScript中变量名为elem

<input type="checkbox" checked="checked" />

elem.checked true (Boolean) Will change with checkbox state
$( elem ).prop( "checked" ) true (Boolean) Will change with checkbox state
elem.getAttribute( "checked" ) "checked" (String) Initial state of the checkbox; does not change
$( elem ).attr( "checked" ) (1.6) "checked" (String) Initial state of the checkbox; does not change
$( elem ).attr( "checked" ) (1.6.1+) "checked" (String) Will change with checkbox state
$( elem ).attr( "checked" ) (pre-1.6) true (Boolean) Changed with checkbox state

根据W3C forms specification,checked属性是一个布尔值,这就意味着只要checked属性在HTML中表现出来了,那么相应的property就应该是true,即使checked没有值,这点儿对其它布尔类型的属性一样适用。

然而关于checked 属性需要记住的最重要的一点是:它和checked property并不是一致的。实际上这个attribute和defaultChecked property一致,而且只应该用来设置checkbox的初始值。checked attribute并不随着checkedbox的状态而改变,但是checked property却跟着变。因此浏览器兼容的判断checkebox是否被选中应该使用property

if ( elem.checked ) 
if ( $( elem ).prop( "checked" ) ) 
if ( $( elem ).is( ":checked" ) )

这对其它一些类似于selected、value这样的动态attribute也适用。

在IE9之前版本中,如果property没有在DOM元素被移除之前删除,使用.prop()方法设置DOM元素property(简单类型除外:number、string、boolean)的值会导致内存泄露。为了安全的设置DOM对象的值,避免内存泄露,可以使用.data()方法。

使用场景

其实明白了上面讲的内容,什么时候该使用.attr()什么时候该使用 .prop()就很清楚了,不过还是传一张坊间很流行的图

jQuery的attr与prop使用介绍

Javascript 相关文章推荐
js静态作用域的功能。
Dec 25 Javascript
分享十五个最佳jQuery 幻灯插件和教程
Mar 27 Javascript
JavaScript 开发规范要求(图文并茂)
Jun 11 Javascript
Javascript脚本实现静态网页加密实例代码
Nov 05 Javascript
节点的插入之append()和appendTo()的用法介绍
Jan 13 Javascript
jQuery中:input选择器用法实例
Jan 03 Javascript
AngularJS实现的锚点楼层跳转功能示例
Jan 02 Javascript
layDate插件设置开始和结束时间
Nov 15 Javascript
微信小程序实现打卡日历功能
Sep 21 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 jQuery
Vue核心概念Action的总结
Jan 18 Javascript
今天,小程序正式支持 SVG
Apr 20 Javascript
JavaScript 数组详解
Oct 10 #Javascript
js导出table数据到excel即导出为EXCEL文档的方法
Oct 10 #Javascript
Jquery attr(&quot;checked&quot;) 返回checked或undefined 获取选中失效
Oct 10 #Javascript
Javascript Web Slider 焦点图示例源码
Oct 10 #Javascript
JS实现程序暂停与继续功能代码解读
Oct 10 #Javascript
js切换光标示例代码
Oct 10 #Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 #Javascript
You might like
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
nodejs教程之入门
2014/11/21 NodeJs
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
巧用canvas
2017/01/21 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
Python基础语法(Python基础知识点)
2016/02/28 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
详解Python3的TFTP文件传输
2018/06/26 Python
python3.6的venv模块使用详解
2018/08/01 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
零件设计自荐信范文
2013/11/27 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
工程项目经理任命书
2014/06/05 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
python cv2图像质量压缩的算法示例
2021/06/04 Python