App下載

jQuery中attr和prop方法的區(qū)別

猿友 2021-01-06 17:50:36 瀏覽數(shù) (2709)
反饋

相比 attr,prop 是 1.6.1 才新出來的,二者從中文意思理解,都是獲得/設(shè)置屬性的方法(attributes 和 properties)。只是,window 或 document 中使用 .attr() 方法在 jQuery1.6 之前不能正常運(yùn)行,由于 window 和 document 中不能有 attributes。prop 應(yīng)運(yùn)而生了。

之前看網(wǎng)上對照二者的文章,更是列出一個表來辨別什么標(biāo)簽下使用 prop,什么標(biāo)簽下使用 attr,諒解我是怠惰的人,最懼怕要背的東西,所以只有自己想一想辦法了。

既然我們想知道他們兩的區(qū)分,最好就看看他們的源代碼,不要被代碼長度所嚇到,我們只看關(guān)鍵的幾句:

attr 方法代碼(jQuery 版本 1.8.3)

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 方法里面,最關(guān)鍵的兩行代碼,elem.setAttribute( name, value + “” )和 ret = elem.getAttribute( name ),很明顯的看出來,使用的 DOM 的 API setAttribute 和 getAttribute 方法操作的屬性元素節(jié)點(diǎn)。

而 prop 方法里面,最關(guān)鍵的兩行代碼,return ( elem[ name ] = value )和 return elem[ name ],你可以理解成這樣document.getElementById(el)[name] = value,這是轉(zhuǎn)化成 JS 對象的一個屬性。



0 人點(diǎn)贊