我编写了一个简单的js函数来打开/关闭复选框,然后单击父级(在本例中为TD)。单击TD 上的任何位置时,此函数按预期工作。
但是当你点击复选框本身时,没有任何反应 我想知道的是为什么它会做到这一点以及最好的解决方法是什么?
I have a provided a jsfiddle to demo this.
这是我的js函数:
$("td.onoff").click(function() {
var objCheckbox = $(this).find("input[type=checkbox]");
if( objCheckbox.length >= 1 ) {
objCheckbox.prop("checked", !objCheckbox.prop("checked"));
}
});
感谢。
答案 0 :(得分:5)
你需要by pass event code when source of event is not td with class onoff
,你可以这样做。
<强> Live Demo 强>
$(function() {
$("td.onoff").click(function(event) {
if(event.target.className != 'onoff') return;
var objCheckbox = $(this).find("input[type=checkbox]");
if( objCheckbox.length >= 1 ) {
objCheckbox.prop("checked", !objCheckbox.prop("checked"));
}
});
});
答案 1 :(得分:1)
检查点击元素的类型。如果没有这个,你就会试图得到一个不存在的元素。
$(function() {
$("td.onoff").click(function() {
var type = $(this).attr('type');
if ( type != "checkbox" ) {
var objCheckbox = $(this).find("input[type=checkbox]");
if( objCheckbox.length >= 1 ) {
objCheckbox.prop("checked", !objCheckbox.prop("checked"));
}
}
});
});
答案 2 :(得分:1)
它以这种方式表现的原因是因为input
触发了父click
事件,此时this
成为复选框,而不是点击的td
,因此.find("input[type=checkbox]")
不会选择任何内容,因此不会执行任何操作。
其他答案的替代方法是将click
事件直接绑定到输入,并阻止它传播,例如:
$("td.onoff > input").click(function(e) {
e.stopPropagation();
});
答案 3 :(得分:0)
添加以下内容:
$("td.onoff :checkbox").click(function(event) {
event.stopPropagation();
});
当您单击复选框时,这可以防止点击事件冒泡到容器。
答案 4 :(得分:0)
使用“for”属性而不是任何javascript函数 这将自动按功能执行: 就在html下面:
<tr class="row" >
<td class="onoff" ><label for="check1"><input id="check1" type="checkbox" name="something[]" checked="checked" /></label></td>
</tr>
<tr class="row">
<td class="onoff"><label for="check2"><input id="check2" type="checkbox" name="something[]" checked="checked" /></td>
</tr>
<tr class="row">
<td class="onoff"><label for="check3"><input id="check3" type="checkbox" name="something[]" checked="checked" /></td>
</tr>