相比 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)上對照二者的文章,更是列出一個(gè)表來辨別什么標(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 對象的一個(gè)屬性。