checkbox属性checked="checked"已有,但复选框却不显示选中的原因

复选框绑定了click事件后,本来应该是点一次选中,再点击取消选中,依次类推。

但今天在用谷歌测试全选复选框的时候,前两次都没有问题,可以正常显示选中和取消,但当再去选中的时候,复选框的属性checkbox值变为"checked",没问题,但是复选框却不显示选中状态,明明属性值改了,但是却不显示勾选,用removeAttr吧属性去掉也不行,太诡异了。

代码修改了却得不到正确的显示状态,纠结了很久,找不到原因。

后来全面展开搜捕行动,经过N久,原来是jQuery版本问题。我操作属性用的是$("**").attr("attrName");而jQuery的版本用的是1.9,这就是存在一个兼容性和稳定性问题。

在jq1.6版之前,没有.prop()方法,而.attr()混淆了attribute和property的概念,导致使用时不小心就会出现bug,如果不读jq源码,还真说不清楚.attr()设置的是attribute还是property。

至于jq为什么这样设计,众说纷纭。有人说jq开发团队自己也没搞清楚attribute和property的区别,也有人说这是过度设计,jq认为用户没必要了解attribute和property的区别,干脆封装到一起了。不管原因是什么,jq这个设计确实不好。

2011年5月份,jq在新版本1.6版中引入新的API .prop()方法,不过升级过程挺痛苦,1.6版对比1.5.2版在.attr()的引入上没有做好向下兼容,一些人升级jq到1.6之后,发现自己的代码挂了。紧接着jq发布1.6.1版解决了兼容问题。

对于加入 .prop() 方法,jq的解释是:首先,给一些DOM对象属性property(比如nodeName,selectedIndex)的获取提供了更简洁的方案,情况前后的对比:

// 不用 .prop()
var elem = $("#foo")[0];
if ( elem ) {
    index = elem.selectedIndex;
}
// 用 .prop()
index = $("#foo").prop("selectedIndex");

另外还有一个原因是.prop()的效率好于.attr()。

即解决方法示例:

$("input[type='checkbox']").prop("checked");

$("input[type='checkbox']").prop("disabled", false);
$("input[type='checkbox']").prop("checked", true);

在使用时将attr改为prop,问题得解。

你遇到这个奇怪的问题了吗?赶紧试试吧~~firefox中 <wbr>checkbox属性checked="checked"已有,但复选框却不显示打钩的原因

posted @ 2015-03-31 16:44  流空-C  阅读(1366)  评论(0编辑  收藏  举报