1. 程式人生 > >jQuery中prop()和attr()方法的測試和總結

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版本,發現不好用了,就自己寫程式碼測試了一下。