jQuery中prop()和attr()方法的測試和總結
對應單選按鈕和複選框的選中一般都是通過增加屬性checked="checked"來使選中,但是在使用jquery時遇到了一些問題,自己做了一個測試,大家可以借鑑下。
期望的結果是,勾選男,點選勾選女,再點選勾選男,依次類推。
性別:<input name="sex" value="男" type="radio" checked/>男<input name="sex" value="女" type="radio" />女<br />
<input id="radioTestBtn" value="測試" type="button"/>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/lib/jquery/1.11.3/jquery.min.js"></script>
$(function(){
$("#radioTestBtn").click(function(){
// 如果勾選男,點選後勾選女;再點選勾選男
var selectedVal = $("input[name='sex']:checked").val();
if ('男' == selectedVal) {
//$("input[value='女']").prop("checked", true);
$("input[value='男']").removeAttr("checked");
$("input[value='女']").attr("checked", true);
} else {
//$("input[value='男']").prop("checked", true);
$("input[value='女']").removeAttr("checked");
$("input[value='男']").attr("checked", true);
}
});
});
一、jQuery 1.11.3
1、prop方法
js/lib/jquery/1.11.3/jquery.min.js
使用prop()方法ok,需要勾選男時,不用去勾選女。這點考慮到單選按鈕組只有一個被選中,勾選一個,其他的都去勾選的原理。
prop() value設定不同的值譬如
$("input[value='男']").prop("checked", "abcde");
$("input[value='男']").prop("checked", "1234");
$("input[value='男']").prop("checked", "false");效果跟$("input[value='男']").prop("checked", true);是一樣的,都會被選中。不過寫程式碼時還是建議$("input[value='男']").prop("checked", true);
2、attr方法
第一次點擊發現女單選按鈕增加了checked="checked"
<input name="sex" value="女" type="radio" checked="checked"> 女,
再次點選按鈕,男單選按鈕由checked變成checked="checked"
<input name="sex" value="男" type="radio" checked="checked">男
後面再點選,男單選按鈕一直被勾選,兩個單選按鈕都有checked="checked",也不對。
繼續測試:
增加了移除checked屬性$("input[value='男']").removeAttr("checked");
第一次點選是女單選按鈕被選中,第二次點選兩個單選按鈕都沒有被選中,後面點選效果一樣,都是沒被勾選。
測試把移除語句放到attr()方法前面,和上面結果是一樣的。
二、換成<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.5.1.min.js"></script>
attr()方法就正常了。不管加不加移除$("input[value='男']").removeAttr("checked");都可以,不過我們程式碼中的checked會被移掉。即使加上放前放後都可以。
不加removeAttr()語句,checked不會被移除,但不影響結果。
prop() Uncaught TypeError: $(...).prop is not a function 懷疑是1.6新加的。
參考:http://www.jb51.net/article/43303.htm
下面是關於jQuery1.6和1.6.1中Attributes模組變化的描述,以及.attr()方法和.prop()方法的首選使用
Attributes模組的變化是移除了attributes和properties之間模稜兩可的東西,但是在jQuery社群中引起了一些混亂,因為在1.6之前的所有版本中都使用一個方法(.attr())來處理attributes和properties。但是老的.attr()方法有一些bug,很難維護。jQuery1.6.1對Attributes模組進行了更新,並且修復了幾個bug。
為了讓jQuery1.6中的.attr()方法的變化被理解的清楚些,下面是一些使用.attr()的例子,雖然在jQuery之前的版本中能正常工作,但是現在必須使用.prop()方法代替:
首先,window或document中使用.attr()方法在jQuery1.6中不能正常執行,因為window和document中不能有attributes。它們包含properties(比如:location或readyState),必須使用.prop()方法操作或簡單地使用javascript原生的方法。在jQuery1.6.1中,window和document中使用.attr()將被自動轉成使用.prop,而不是丟擲一個錯誤。
其次,checked,selected和前面提到的其它boolean attributes,因為這些attributes和其相應的properties之間的特殊關係而被特殊對待。基本上,一個attribute就是以下html中你看到的:
<input type=”checkbox” checked=”checked”>
boolean attributes,比如:checked,僅被設定成預設值或初始值。在一個checkbox的元素中,checked attributes在頁面載入的時候就被設定,而不管checkbox元素是否被選中。
properties就是瀏覽器用來記錄當前值的東西。正常情況下,properties反映它們相應的attributes(如果存在的話)。但這並不是boolean attriubutes的情況。當用戶點選一個checkbox元素或選中一個select元素的一個option時,boolean properties保持最新。但相應的boolean attributes是不一樣的,正如上面所述,它們僅被瀏覽器用來儲存初始值。
個人總結:使用幾次的經驗覺得使用prop()更靠譜,畢竟使用1.5.1版本的jquery是少數。
只是之前寫的程式碼做了一個表格,標題有一個全選的複選框,每行有一個複選框,使用.attr()正常
換了一個jquery版本,發現不好用了,就自己寫程式碼測試了一下。