快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡新京返水:jQuery的attr与prop方法对比



jQuery1.6中新添加了一个prop措施,看起来和用起来都和attr措施一样,这两个措施有什么差别呢?这要从HTMl 的attribute与property差别提及,attr与prop恰是这两个器械的缩写。

attribute与property

attribute和property都可以翻译为属性,为了以示差别,平日把这两个单词翻译为属性与特点。

div id="test">Click Herediv>

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

div id="test">123div>

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">123div>

经由过程措施 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的propert澳门新葡新京返水y,类似于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'));//nullconsole.log(t.checked);//false;

t.setAttribute('checked','checked');

console.log(t.getAttribute('checked'));//checkedconsole.log(t.checked);//true

t.checked=fa澳门新葡新京返水lse;

console.log(t.getAttribute('checked'));//checkedconsole.log(t.checked);//false

4. 对付一些和路径相关的属性,两者取得值也不尽相同,然则同样attribute取得是字面量,property取得是谋略后的完备路径

a id="test4" href="#">Clicka>

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中体现出来了,那么响应的prop澳门新葡新京返水erty就应该是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()就很清楚了,不过照样传一张坊间很盛行的图

您可能还会对下面的文章感兴趣: