我这样做:
$("input[type='checkbox']").each(function() {
var current = $(this);
$("label[for='" + current.attr("id") + "']").on('click', function() {
current.change();
alert('1');
});
});
$("input[type='checkbox']").on("change", function() {
alert('2');
});
现在,当我点击标签时,复选框第一个警报(1)显示一次,但第二个(2)显示两次。你能告诉我为什么吗? (隐藏的复选框,似乎改变发生了两次)
答案 0 :(得分:4)
您不必为<label>
标记添加单独的事件处理程序。它会触发<input>
上的“点击”。
最好使用“click”而不是“change”(特别是使用最新的jQuery)。旧的(可能是新的)IE版本不会在复选框上触发“更改”,直到焦点发生变化。
编辑最新jQuery让生活更美好的原因在于它修复了图书馆长期以来奇怪的“功能”。以前,以编程方式触发“单击”将导致在点击效果发生之前,使用状态中的元素调用任何“单击”处理程序。也就是说,如果你打电话
$(myCheckbox).trigger("click");
并检查了元素,将在对处理程序的调用中检查它。但是,当发生真实的点击时,浏览器会在调用处理程序之前翻转“已检查”属性的状态。这让生活变得非常奇怪,但截至1.9我很确定这是固定的。