attr()和prop()的前世此生

attr(全稱爲attribute),prop(全稱爲property),二者均可以翻譯爲屬性,爲了區分兩者,有些中文文檔將前者翻譯爲特性,後者翻譯爲屬性。簡單地說,attr表示HTML標籤的屬性,而prop表示DOM對象的屬性。兩者從本質上來講是不同的,但它們經常被混爲一談,部分緣由在於DOM對象的屬性大多與其所對應的HTML屬性同名,好比id,href,type,但也有不一樣,好比DOM對象中有className屬性,而HTML標籤中有class屬性。
    
    在jquery的在早期版本中,沒有區分出attr和prop,只有一個attr()。jQuery 1.6版本,提供了一個新的方法來獲取和設置屬性,這個方法這是prop()。在此以前,prop()的職能只能由attr()代爲行使。官方建議,對於只有true和false兩個值的屬性(如checked、selected、disabled等),應當使用prop()。若是你恰恰就不聽建議,就是要用attr(),那麼讓咱們看下有什麼後果(此處以checked爲例)。

    這是HTML代碼:
<input type="checkbox" id="check1">
<label for="check1">Check me</label>

    這是jQuery代碼:

$(function(){
    $("input").change(function(){
        console.log($(this).attr("checked"));
        console.log($(this).prop("checked"));
        });
    });
 
    在不一樣的jquery版本下,有不一樣的輸出結果,以下面的表格所示:

各個jquery版本下的輸出結果

分析:
    從上面能夠看出,1.6版本以前,使用attr()能獲得正確的結果,而使用prop()會返回類型錯誤(由於該方法尚未被定義);從1.6.0版本起,attr()獲得的結果都不符合預期,而使用prop()能夠獲得正確的結果。能夠簡單地理解爲,從1.6.0版本起,attr()讓出了那些本不屬於本身的權力,而prop()得到了它的權力(這就像古代的攝政王要在皇帝大婚以後將皇權交回皇帝手中同樣)。所以,咱們仍是要遵循官方的建議,該用prop()的地方就不要再用attr()了。

總結:
    應該用prop()獲取的屬性以下:async,autofocus,checked,location,multiple,readOnly,selected。

本文中部分觀點爲我的理解,不當之處,敬請批評指正
參考文檔:http://api.jquery.com/prop/
相關文章
相關標籤/搜索