1. 程式人生 > >jQuery RemoveAttr(checked)之後再Attr(checked)屬性無效果的原因分析

jQuery RemoveAttr(checked)之後再Attr(checked)屬性無效果的原因分析

在做複選框全選按鈕的時候,出現了一個問題,使用語句$.attr('checked',true),將複選框的屬性改為被選中,在chrome瀏覽器中第一次點選有效後面就不行了,IE8倒是沒有問題。

百度了很久找到原因是HTML的屬性分為attribute和property,暫且將後者稱為特性。

checked屬性即分為attribute->checked,和property->true,false。

對於一個checkbox,若未定義checked="checked",alert($.attr("checked")) 的結果是undefined。若已定義則結果是checked。attribute並不隨著checkbox的狀態變化而改變。

使用prop($.attr("checked"))的話輸出則分別為false和true。property則隨其變化而變化。

所以在修改checked屬性時要使用prop()。prop()在jQuery1.6版本後新增。

網上關於其他類似屬性的圖表:

另外關於在IE9之前版本中,如果property沒有在DOM元素被移除之前刪除,使用.prop()方法設定DOM元素property(簡單型別除外:number、string、boolean)的值會導致記憶體洩露。為了安全的設定DOM物件的值,避免記憶體洩露,可以使用.data()方法。 目前尚未遇到,先記在這裡。

$('#checkbox').attr('checked'); 返回的是checked或者是undefined,不是原來的true和false了,有關此問題的解決方法如下

在JQ1.6之前的版本,我們會這樣寫我們的程式碼: 

  1. <input type='checkbox' id='cb'/>   
  2. <script>   
  3. //獲取是否選中   
  4. var isChecked = $('#cb').attr('checked');   
  5. //設定選中   
  6. $('#cb').attr('checked',true);   
  7. </script>   


這樣寫在JQ1.6之前完全沒問題,可是當我們升級JQ1.6到更高的版本時,問題就來了,此時我們會發現: 
$('#cb').attr('checked'); 返回的是checked或者是undefined,不是原來的true和false了。 並且checked屬性在頁面初始化的時候已經初始化好了,不會隨著狀態的改變而改變。所以如果checkbox一開始是選中的,那麼返回的是checked,如果一開始沒被選中,則返回的是undefined

  1. <input type='checkbox' id='cb'/>   
  2. <script>   
  3. //獲取是否選中   
  4. var isChecked = $('#cb').prop('checked');   
  5. //或   
  6. var isChecked = $('#cb').is(":checked");   
  7. //設定選中   
  8. $('#cb').prop('checked',true);   
  9. </script>   


分析了其中的原因,可以這樣理解: 
它將“屬性”與“特性”做了區別,屬性指的是“name,id”等等,特性指的是“selectedIndex, tagName, nodeName”等等。 
JQ1.6之後,可以通過attr方法去獲得屬性,通過prop方法去獲得特性

    1. $("#cb").attr("tagName"); //undefined   
    2. $("#cb").prop("tagName"); //INPUT