jquerycheckbox勾选的bug问题解决⽅案与分析
在做项⽬的时候遇到个jQuery checkbok复选框的选中取消的BUG,咨询了⼤神,才闹明⽩怎么回事,这⾥记录下来,分析给⼤家。
jquery的attr属性先上代码:
复制代码代码如下:
<form>
你爱好的运动是?<input type="checkbox" id="CheckedAll" />全选/全不选<br />
<input type="checkbox" name="items" value="⾜球" />⾜球
<input type="checkbox" name="items" value="篮球" />篮球
<input type="checkbox" name="items" value="⽻⽑球" />⽻⽑球
<input type="checkbox" name="items" value="乒乓球" />乒乓球
<br />
<input type="button" id="send" value="提交" />
</form>
复制代码代码如下:
$("#CheckedAll").click(function () {
if ($(this).is(":checked")) {
$("[name=items]:checkbox").attr("checked", true);
} else {
$("[name=items]:checkbox").attr("checked", false);
}
});
第⼀次执⾏,没问题,但第⼆次执⾏就有问题了,选择不了
解决办法:把attr()换成prop()
复制代码代码如下:
$("#CheckedAll").click(function () {
if ($(this).is(":checked")) {
$("[name=items]:checkbox").prop("checked", true);
} else {
$("[name=items]:checkbox").prop("checked", false);
}
});
PS:prop()和attr()区别:
最近在iteye的新闻中看到jQuery已经更新到了1.6.1。和之前版本的最⼤变化是增加了.prop⽅法。但是.
prop()⽅法和.attr()⽅法,单从字⾯上很难区分。在汉语中properties和attributes都有表⽰“属性”的意思。
下⾯根据这篇博⽂(javascript:mctmp(0);),简要翻译了.prop()和.attr()的⽤法:
1、从1.5.2升级到1.6.1
通过介绍新⽅法.prop()以及.attr()⽅法的改变,jQuery1.6.1引起了⼀场关于attributes和properties之间有何区别和联系的激烈讨论。同时,1.6.1也解决了⼀些向后兼容性问题。当从1.5.2升级到1.6.1时,你不必修改任何attribute代码。
下⾯是关于jQuery1.6和1.6.1中Attributes模块变化的描述,以及.attr()⽅法和.prop()⽅法的⾸选使⽤。然⽽,正如前⾯所
述,jQuery1.6.1允许你使⽤.attr()⽅法就像以前它被使⽤在所有的情况中⼀样。
2、发⽣了什么变化
Attributes模块的变化是移除了attributes和properties之间模棱两可的东西,但是在jQuery社区中引起了⼀些混乱,因为在1.6之前的所有版本中都使⽤⼀个⽅法(.attr())来处理attributes和properties。但是⽼的.attr()⽅法有⼀些bug,很难维护。
jQuery1.6.1对Attributes模块进⾏了更新,并且修复了⼏个bug。
特别提到的是,boolean attributes,⽐如:checked,selected,readonly和disabled在1.6.1中和1.6之前的处理相同。这意味着
下⾯的代码:
复制代码代码如下:
$(“:checkbox”).attr(“checked”, true);
$(“option”).attr(“selected”, true);
$(“input”).attr(“readonly”, true);
$(“input”).attr(“disabled”, true);
甚⾄是这样的代码:
复制代码代码如下:
if ( $(“:checkbox”).attr(“checked”) ) { /* Do something */ }
在1.6.1中没有必要为了保持之前期望的运⾏结果⽽发⽣任何改变。
为了让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是不⼀样的,正如上⾯所述,它们仅被浏览器⽤来保存初始值。
复制代码代码如下:
$(“:checkbox”).get(0).checked = true;
// Is the same as $(":checkbox:first").prop(“checked”, true);
在jQuery1.6中,如果使⽤下⾯的⽅法设置checked:
复制代码代码如下:
$(“:checkbox”).attr(“checked”, true);
将不会检查checkbox元素,因为它是需要被设置的property,但是你所有的设置都是初始值。
然⽽,曾经jQuery1.6被释放出来的时候,jQuery团队明⽩当浏览器仅关⼼页⾯加载时,设置⼀些值不是特别的有⽤。所以,为了保持向后兼容性和.attr()⽅法的有⽤性,我们可以继续在jQuery1.6.1中使⽤.attr()⽅法取得和设置这些boolean attributes。
最普通的attributes是checked,selected,disabled和readOnly,但下⾯是jQuery1.6.1⽀持的使⽤.attr()动态地取得和设置boolean attributes/properties的完整列表:
autofocus, autoplay, async, checked, controls, defer, disabled,
hidden, loop, multiple, open, readonly, required, scoped, selected
(译者注:⼤部分都是html5新增的属性)
还是建议使⽤.prop()⽅法来设置这些boolean attributes/properties,即使这些⽤例没有转换成使⽤.prop()⽅法,但是你的代码仍然可以在jQuery1.6.1中正常运⾏。
下⾯是⼀些attributes和properties的列表,正常情况下,应该使⽤其对应的⽅法(见下⾯的列表)来取得和设置它们。下⾯的是⾸⽤法,但是.attr()⽅法可以运⾏在所有的attributes情况下。
注意:⼀些DOM元素的properties也被列在下⾯,但是仅运⾏在新的.prop()⽅法中
*例如: window.location
**如果需要在(if needed over) .width()
.attr()和.prop()都不应该被⽤来取值/设值。使⽤.val()⽅法代替(即使使⽤.attr("value","somevalue") 可以继续运⾏,就像1.6之前做的那样)
3、⾸选⽤法的概述
.prop()⽅法应该被⽤来处理boolean attributes/properties以及在html(⽐如:window.location)中不存在的properties。其他所有的 attributes(在html中你看到的那些)可以⽽且应该继续使⽤.attr()⽅法来进⾏操作。
上⾯的概述已经描述的够清楚了,我也没有必要再总结了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。