attr和prop分別是單詞attribute和property的縮寫(property:屬性,attribute:特性),非常容易混淆,兩個(gè)單詞的中文翻譯也都非常相近,但實(shí)際上,二者是不同的東西,屬于不同的范疇。
attr與prop區(qū)別
對于HTML元素本身就帶有的固有屬性,在處理時(shí),使用prop方法。
對于HTML元素我們自己自定義的DOM屬性,在處理時(shí),使用attr方法。
- 深層理解
在jQuery中,prop()函數(shù)的設(shè)計(jì)目標(biāo)是用于設(shè)置或獲取指定DOM元素(指的是JS對象,Element類型)上的屬性(property);attr()函數(shù)的設(shè)計(jì)目標(biāo)是用于設(shè)置或獲取指定DOM元素所對應(yīng)的文檔節(jié)點(diǎn)上的屬性(attribute)。
當(dāng)然,在jQuery的底層實(shí)現(xiàn)中,函數(shù)attr()和prop()的功能都是通過JS原生的Element對象實(shí)現(xiàn)的。attr()函數(shù)主要依賴的是Element對象的getAttribute()和setAttribute()兩個(gè)方法。prop()函數(shù)主要依賴的則是JS中原生的對象屬性獲取和設(shè)置方式。
DOM固有屬性
<a target="_self" class="btn">百度</a>
這個(gè)例子里<a>元素的DOM屬性有“href、target和class",這些屬性就是<a>元素本身就帶有的屬性,也是W3C標(biāo)準(zhǔn)里就包含有這幾個(gè)屬性,或者說在IDE里能夠智能提示出的屬性,這些就叫做固有屬性。處理這些屬性時(shí),建議使用prop方法。
自定義的DOM屬性
<a href="#" id="link1" action="delete">刪除</a>
這個(gè)例子里<a>元素的DOM屬性有“href、id和action”,很明顯,前兩個(gè)是固有屬性,而后面一個(gè)“action”屬性是我們自己自定義上去的,<a>元素本身是沒有這個(gè)屬性的。這種就是自定義的DOM屬性。處理這些屬性時(shí),建議使用attr方法。使用prop方法取值和設(shè)置屬性值時(shí),都會(huì)返回undefined值。
注意
對于表單元素的checked、selected、disabled等屬性。
在jQuery 1.6之前,attr()獲取這些屬性的返回值為Boolean類型:如果被選中(或禁用)就返回true,否則返回false。
從1.6開始,使用attr()獲取這些屬性的返回值為String類型,如果被選中(或禁用)就返回checked、selected或disabled,否則(即元素節(jié)點(diǎn)沒有該屬性)返回undefined。并且,在某些版本中,這些屬性值表示文檔加載時(shí)的初始狀態(tài)值,即使之后更改了這些元素的選中(或禁用)狀態(tài),對應(yīng)的屬性值也不會(huì)發(fā)生改變。
因?yàn)閖Query認(rèn)為:attribute的checked、selected、disabled就是表示該屬性初始狀態(tài)的值,property的checked、selected、disabled才表示該屬性實(shí)時(shí)狀態(tài)的值(值為true或false)。
因此,在jQuery 1.6及以后版本中,請使用prop()函數(shù)來設(shè)置或獲取checked、selected、disabled等屬性。對于其它能夠用prop()實(shí)現(xiàn)的操作,也盡量使用prop()函數(shù)。
property能夠從attribute中得到同步;
attribute不會(huì)同步property上的值;
詳情參考鏈接
參考
各種不同之處的比較
http://www.365mini.com/page/jquery-attr-vs-prop.htm
實(shí)現(xiàn)原理上介紹
http://www.cnblogs.com/elcarim5efil/p/4698980.html