两个选项(都涉及tr:not
从现有代码中删除内容,正如您所说的那样不起作用 -tr
元素不能是复选框,并:not
检查元素,而不是其内容):
将事件处理程序添加到调用e.stopPropagation
. 然后点击事件不会到达该行。您可以直接执行此操作,也可以通过委托执行此操作。这是一个直接的活生生的例子。如果您采用间接方式,请务必在label
您打算支持的所有浏览器上测试单击激活复选框(如果您将拥有它们)的 s。
或者
将此添加到您的处理程序:
if ($(event.target).is('input[type=checkbox]')) {
return;
}
例如:
$('table').on('click', 'td', function(event) {
if ($(event.target).is('input[type=checkbox]')) {
return;
}
// Logic here
});
这可以通过测试事件的来源来查看它是否是一个复选框,并尽早退出。
在这两种情况下,如果您使用 alabel
来激活复选框,您可能需要对标签执行相同的操作。
我对#2 处理 s 的样子感到好奇label
,结果证明它足以移动到函数中,但并不难&mdash 可能我会怎么做:Live example | 来源
jQuery(function($) {
// The table cell click handler
$("table").on("click", "td", function(e) {
// Is the source a checkbox or the label for
// one?
if (isCheckbox($(e.target))) {
return;
}
// Normal handling
$(this).toggleClass("foo");
});
// Function to test whether the source is a
// checkbox, or the label of a checkbox
function isCheckbox($elm) {
var chkid;
if ($elm.is("input[type=checkbox]")) {
return true;
}
if ($elm.is("label")) {
chkid = $elm.attr("for");
if (chkid) {
return $("#" + chkid).is("input[type=checkbox]");
}
return !!$elm.find("input[type=checkbox]")[0];
}
return false;
}
});