1. 程式人生 > >jQ中的attr() 和 prop() 的區別,以及底層探討!

jQ中的attr() 和 prop() 的區別,以及底層探討!

一..attr()和prop()的區別 

1.兩者都是設定屬性,但是又有所不同..

attr()實際上是對html元素上的屬性進行設定或者獲取.

而prop()是對我們用js/jq獲取到的DOM元素物件進行屬性設定或者獲取.

比如:常見的表單標籤:

<input type='text' class='username' name='username'>

以上的input標籤有3個屬性,type,class,name,在jq中我們可以通過attr()方法來獲取/設定這些屬性,而當我們試圖用prop()方法來獲取這些屬性時,我們發現,只能獲取到class的屬性,而type和name的屬性都為undefined !

這是為什麼?

因為在attr()屬性的底層:

使用get/setAttribute()實現的 !

 

 

對於prop()來說,他是對 物件 進行屬性設定/獲取 !

如對於一個input物件來說  獲取如下:

$('input').prop('checked')  值為 fasle.

$('input').prop('autofocus')  值為 fasle.

而在以上的屬性中顯然沒有 name / type 這些個屬性, 所以是undefined..........而之所以能獲取到 class 是因為如:id/title/class這些個常用屬性已經被附加到DOM物件上去了,直接獲取就行!

 

二.....對於自定義屬性

1.在html上的自定義屬性,如:

<input type='text' class='username' name='username' name111='name111'>

可以看出,name111是我們自定義的一個屬性,對於這種自定義的屬性,我們可以通過 .attr() 來獲取,使用prop()是獲取不到的.

2.在元素物件上的自定義屬性,如:

先獲取dom物件: var oInput = $('input').get(0);

向dom物件中新增一個自定義屬性: oInput['name222'] = 'name222';

這裡注意的是 js原生的 向物件中 新增自定義屬性的方式為:  elem['name'] = value

這時候我們使用jq的prop方法:

$('input').prop('name222')  ----> 能得到 'name222',

而使用$('input').attr('name222') 得到的就為undefined !

由此我們能夠知道,jq的prop()方法的底層為:

elem[name]   就是原生的js新增自定義屬性.

 

為什麼 checked / selected / disabled 要使用prop()方法? 

因為這些方法都在 DOM物件中,prop()方法能夠獲取dom物件中的屬性.

如果沒有在html中設定 checked / selected / disabled 這些屬性,name用attr()獲取到的全是undefined !

但是如果設定了以上屬性,那麼呼叫attr()方法,會返回相應的 ''字串'' :

如:

//在H5中 如果 屬性名=屬性值,那麼只用寫屬性名就行
//如 checked = 'checked',那麼只需要寫checked
<input type='checkbox' class='hobby' checked>

對於以上程式碼  

$('.hobby').attr('checked')  返回的是 ''checked'' (字串形式);

$('.hobby').prop('checked) 返回的是 true (boolean形式);

而:

$('.hobby').attr('disabled') 返回的是undefined

$('.hobby').prop('disabled') 返回的是false