1. 程式人生 > 實用技巧 >prop()和attr()我該翻誰的牌子?

prop()和attr()我該翻誰的牌子?

先上程式碼:

// 全選
    function CheckAll() {
        if ($("#th_checkbox").prop('checked'))
            $('input[name="subCheckBox"]').each(function () {
                $(this).prop('checked', true);
            });
        else
            $('input[name="subCheckBox"]').each(function () {
                $(this).prop('checked', false);
            });
    }

  

之前在做病理接收的頁面的時候,需要做一個全選與反選的控制元件。在做控制元件的過程中,遇到一個問題,就是將程式碼中的prop方法換成attr方法,這個控制元件就失效了,改成prop方法就又可以了。以前也遇到過這個問題,當時並沒有深究,這次就好好查了下資料,結合網上的例子,明確了二者之間的區別。

1.prop()

(1)對於HTML元素本身就帶有的固有屬性,在處理時,使用prop方法。

如果把DOM元素看成是一個普通的Object物件,這個物件在其定義時就具有一些屬性(property),比如:

var option = 
{
    selected:false,
     disabled:false,
     attributes:[],
     ...
 }

這個時候就使用prop()方法。

再舉個例子:

<a href="#" id="link1" action="delete">刪除</a>

當需要對a標籤中的href進行操作時就要用prop()方法,因為href和id是a標籤的固有屬性。如圖:

(2)jq 1.6的官方文件建議,對值為true和false的屬性使用prop()

<input type="checkbox"  id="check1"/>記住密碼
<input type="checkbox"  id="check1" checked="checked"/>記住密碼

$("#chke1").prop("checked");// false
$("#chke2").prop("checked");// true

$("#chke1").attr("checked"); //undefined
$("#chke2").attr("checked");//"checked"

$('').prop()返回的是DOM物件

2.attr()

(1)attr是從頁面搜尋獲得元素值,所以頁面必須明確定義元素才能獲取值

(2)$('').attr()返回的是html物件

(3) 標籤中我們自定義的屬性用attr()

如:

<a href="#" id="link1" action="delete">刪除</a>

其中action是我們自定義的屬性,這時候我們要用attr()

根據(1),再舉個例子:

<img src="https://www.runoob.com/images/pulpit.jpg" />

此時用$("img").attr("width")是獲取不到值的,因為頁面原始碼中沒有定義width屬性,因為attr()掃描了頁面原始碼。而用$("img").prop("width") 可返回 284。

綜上所述:

1、當需要對頁面標籤自帶的屬性進行操作時,用prop(),其他屬性用attr()

2、當屬性值只有true和false的值時,用prop()

3、操作checkbox、radio時用prop()

4、官方建議,如圖:

補充一點說明,雖然官方建議圖中關於checked屬性attr和prop都可以,但開發中還是用prop,因為checked對於attr可以選中但是不能取消,選中時值是不會變的,而用prop選中時值是會變的,可以選中也可以取消。