![](/img/trans.png)
[英]Why does preventDefault on checkbox click event returns true for the checked attribute?
[英]Why does a checkbox's “checked” attribute return the opposite of it's actual value on click event?
我有以下HTML
<li><input type="checkbox" /><label>This is the label!</label></li>
我将点击事件绑定到li,并在执行任何其他操作之前让click事件冒泡到li。
$('li').each(function(i){
var item = $(this);
var checkbox = $("input[type='checkbox']", item);
item.bind('click', function(e){
var isChecked = checkbox.is(':checked');
console.log(isChecked);
e.stopPropagation();
});
});
从未选中的复选框开始,当click事件触发时,isChecked在我单击复选框时返回true,但是当我单击标签或li时返回false。 有谁知道为什么?
[编辑:]为了证明这个问题,请看看这个http://jsfiddle.net/nYbf6/2/ 。
请注意,您永远不能通过单击复选框切换复选框,因为“checked”属性始终返回单击复选框时不存在的内容。
[编辑:]今天在这里找到答案: http : //www.bennadel.com/blog/1525-jQuery-s-Event-Triggering-Order-Of-Default-Behavior-And-triggerHandler-.htm 。 我不喜欢这个解决方案,但它比没有解决方案更好。
复选框的click事件在值更改之前触发。 这样,如果在覆盖click事件时返回false,则会阻止复选框更改其值。 您应该更改事件以激活复选框,而不是包含它的li。
你会做的更好,以获取相应的复选框作为的一部分click
,如下所示:
$('li').click(function(e) {
var isChecked = $(':checkbox:checked', this).length > 0;
console.log(isChecked);
e.stopPropagation();
});
这会在单击<li>
时找到单击时单击的复选框。
至于为什么部分,如果你点击复选框,你将其设置为true,然后事件传播到li
,确定复选框确实已检查。 如果您点击标签时未使用框,则不会选中该框,因此它仍然是错误的。 如果您选中了该框, 则单击该标签,您将看到true
回来,因为现在已经检查过了。
如果你期待的标签,选中该复选框,则需要使用标签对涉及它for
属性,就像这样:
<li>
<input id="myInput" type="checkbox" />
<label for="myInput">This is the label!</label>
</li>
然后浏览器将处理连接,单击标签将切换复选框。
试试这个:
<li>
<input type='checkbox' value='foo' id='myFavoriteCheckbox'>
<label for='myFavoriteCheckbox'>The Label</label>
</li>
现在,当您单击标签时,复选框将受到影响。 将处理程序绑定到复选框并检查.attr('checked')
,您会发现即使在click
事件上,复选框的值也是正确的。 另请注意, 即使您决定停止传播并阻止事件的默认设置 ,也是如此。 换句话说,如果您处理click
事件并决定阻止默认操作,则处理程序仍会看到“已检查”的值设置为未停止默认操作时的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.