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,问题得解。
你遇到这个奇怪的问题了吗?赶紧试试吧~~