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之前的版本,我們會這樣寫我們的程式碼:
- <input type='checkbox' id='cb'/>
- <script>
- //獲取是否選中
- var isChecked = $('#cb').attr('checked');
- //設定選中
- $('#cb').attr('checked',true);
- </script>
這樣寫在JQ1.6之前完全沒問題,可是當我們升級JQ1.6到更高的版本時,問題就來了,此時我們會發現:
$('#cb').attr('checked'); 返回的是checked或者是undefined,不是原來的true和false了。 並且checked屬性在頁面初始化的時候已經初始化好了,不會隨著狀態的改變而改變。所以如果checkbox一開始是選中的,那麼返回的是checked,如果一開始沒被選中,則返回的是undefined
- <input type='checkbox' id='cb'/>
- <script>
- //獲取是否選中
- var isChecked = $('#cb').prop('checked');
- //或
- var isChecked = $('#cb').is(":checked");
- //設定選中
- $('#cb').prop('checked',true);
- </script>
分析了其中的原因,可以這樣理解:
它將“屬性”與“特性”做了區別,屬性指的是“name,id”等等,特性指的是“selectedIndex, tagName, nodeName”等等。
JQ1.6之後,可以通過attr方法去獲得屬性,通過prop方法去獲得特性
- $("#cb").attr("tagName"); //undefined
- $("#cb").prop("tagName"); //INPUT