我有一个简单的设置,一个表格,其单元格中有复选框。我有两个事件,一个响应单击复选框,另一个响应单击“tr”元素。当我单击一个复选框时,我不希望触发表行事件。我试过event.stopPropagation()
和return false;
没有运气。这是一个片段:
$("tr").click(function() {
alert("tr clicked");
});
$("input[type=checkbox]").change(function(event) {
event.stopPropagation();
alert("checkbox clicked");
});
有类似的东西:
<tr>
<td><input type="checkbox" id="something" name="something" /></td>
</tr>
如果更改事件触发,则click事件也将触发。如果在tr
的{{1}}元素中更改了复选框,有关如何停止td
点击事件的任何线索?
答案 0 :(得分:5)
我推荐这个:
$( '#theTable' ).delegate( 'tr', 'click', function ( e ) {
if ( $( e.target ).is( 'input:checkbox' ) ) {
alert( 'checkbox clicked' );
} else {
alert( 'tr clicked' );
}
});
因此,您对整个表格只有一个点击处理程序。
顺便说一句,您不必将所有代码放在这个处理程序中。您可以为每个操作设置单独的功能(单击复选框,单击VS行),然后单击...
$( '#theTable' ).delegate( 'tr', 'click', function ( e ) {
if ( $( e.target ).is( 'input:checkbox' ) ) {
checkboxClicked( e );
} else {
rowClicked( e );
}
});
function checkboxClicked ( e ) {
// process event
}
function rowClicked ( e ) {
// process event
}
答案 1 :(得分:1)
使用click
代替change
。似乎在这里工作http://jsfiddle.net/usmanhalalit/mGVv7/1/
$("input[type=checkbox]").click(function(event) {
event.stopPropagation();
alert("checkbox clicked");
});
答案 2 :(得分:0)
问题是.change
和.click
是在复选框操作期间的不同时间触发的不同事件,因此一个处理程序不会影响另一个。您可以在点击处理程序中添加一个检查:
$("tr").click(function(event) {
if (event.target.type == 'checkbox') return;
alert("tr clicked");
});
$(":checkbox").change(function(event) {
alert("checkbox clicked");
});
或者对两个处理程序使用.click
事件:
$("tr").click(function(event) {
alert("tr clicked");
});
$(":checkbox").click(function(event) {
event.stopPropagation();
alert("checkbox clicked");
});
答案 3 :(得分:0)
您需要在复选框上捕捉.click()
事件,而不是.change()
事件。
当.change()
被触发时,点击事件已被处理,并将DOM冒充回DOM到父元素。