关闭

jQuery的attr与prop使用介绍

227人阅读 评论(0) 收藏 举报

jQuery的attr与prop使用介绍

jQuery1.6中新添加了一个prop方法,看起来和用起来都和attr方法一样,这两个方法有什么区别呢?这要从HTMl 的attribute与property区别说起,attr与prop正是这两个东西的缩写
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容易混倄是因为很多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没有作区分,依然共享自定义属性数据



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()就很清楚了,不过还是传一张坊间很流行的图

image

1
0
查看评论

jquery中attr方法和prop方法的区别

jQuery中,用于获取属性的方法,主要是基于prop方法的,我们经常使用的是attr方法,不过在attr方法中,有时候会出现一些问题的,这里就看下jquery的API中attr的介绍,主要内容翻译自jQuery的API介绍:attr() 1.基本使用方法 attr()的作用:获取匹配到的第一个元...
  • Lingfeng928
  • Lingfeng928
  • 2016-12-15 17:53
  • 800

jquery 属性操作 attr( ) prop()css( )区别

attr () 和 prop( ) css( )
  • qq_35809245
  • qq_35809245
  • 2017-01-13 00:33
  • 1492

jQuery .attr() .prop() .data()区别及全选等问题

jQuery .attr() .prop() .data()区别
  • xuanxuan129
  • xuanxuan129
  • 2016-05-24 09:11
  • 1040

【jQuery】对于复选框操作的attr与prop

这个是在jQuery1.6版本之后出现的鬼东西。受影响的主要有下拉列表select与复选框checkbox。众所周知,在jQuery中可以用attr()取出节点的属性,然而对于checkbox却不是这样了,比如我要取出其是否被选中的属性checked,attr("checked"...
  • yongh701
  • yongh701
  • 2015-06-06 10:16
  • 1650

jQuery中html()、text()和val()的区别、jQuery中attr()和prop()的区别

jQuery中html()、text()、val()的区别 html():向匹配的元素中添加html标记。比如、等html标签。添加的元素将覆盖原有的元素内容。 text():向匹配的元素中添加文本。如果文本包含html标签将会以文本的形式输出。添加的文本将会覆盖原有的元素内容。 val():设置或...
  • fly_zxy
  • fly_zxy
  • 2016-02-15 11:07
  • 1149

jQuery中使用attr(), prop(), val()获取value的异同

jQuery中有3个获取元素value值的函数比较相似:attr(), prop(), val();拿来比较一下。        示例代码:<!DOCTYPE html> <html lang="en"> <head> <me...
  • u014291497
  • u014291497
  • 2016-02-05 23:48
  • 2866

jquery中prop和attr的区别

jquery中prop和attr的区别prop:prop(name|properties|key,value|fn)**概述** 获取在匹配的元素集中的第一个元素的属性值。 随着一些内置属性的DOM元素或window对象,如果试图将删除该属性,浏览器可能会产生错误。 jQu...
  • H5_QueenStyle12
  • H5_QueenStyle12
  • 2016-05-10 15:51
  • 1385

在IE11和Firefox下attr和prop的兼容性问题(IE低版本和google没有问题)

最近工作中遇到一个比较棘手的兼容性问题,下面就分享一下解决过程吧 背景说明: 左边一个文本框,右边一个下拉框,下拉框显示从数据库取出来的数据,功能要求左边的文本框输入右边下拉框的value值,下拉框自动定位到 对应的数据,如果输入的值下拉框没有,则返回到为空的状态 ■现象 使用jquery语句$(t...
  • tancy_weipj
  • tancy_weipj
  • 2016-02-04 10:34
  • 2796

attr()和prop()的区别(-----简单易懂-----)

精华: To retrieve and change DOM properties such as the checked, selected, or disabled state of form elements, use the .prop() method.  根据官方的建议:具...
  • qq_27093465
  • qq_27093465
  • 2015-12-18 10:45
  • 3257

jquery attr和prop区别 attr选中checkbox不起作用

问题再现 使用jquery选中checkbox时,只有鼠标点击后,才起作用,之后就不起作用,$("#mycheckbox").attr("checked",true) 后来搜到很多说明,说是jquery版本的缘故,要用prop,这个理由很笼统,没弄懂attr和...
  • wangjun5159
  • wangjun5159
  • 2015-11-30 22:01
  • 972
    个人资料
    • 访问:1278次
    • 积分:28
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章存档