jquery - 复选框在自行选择时不起作用
问题描述
我有一张桌子,每一行都有一个复选框。
<table id="myTable">
<tr>
<td>
<input type="checkbox" class="checkbox">
</td>
<td>
content
</td>
</tr>
... more rows
</table>
我想选中/取消选中复选框并在单击一行时更改类。这很好用,但是,当我单击复选框本身时,什么也没有发生。从字面上看,甚至无法选中/取消选中。
$(document).on("click", "#myTable tr", function() {
var ths = $(this),
chk = ths.find(".checkbox");
if (chk.is(":checked")) {
ths.removeClass("success");
chk.prop("checked", false);
} else {
ths.addClass("success");
chk.prop("checked", true);
}
});
不太确定我错过了什么。
解决方案
单击复选框时,该事件会冒泡到 TR 并切换两次 - 因为 TR 单击会这样做。
解决方案:
由于停止事件传播通常是一个草率的想法1,您可以改为 检测谁是第一个接收事件的元素 ( Event.target
) - 并采取相应的行动:
$("#myTable").on("click", "tr", function(evt) {
var $tr = $(this),
chk = $tr.find(".checkbox")[0]; // ! Not a jQuery Object, but a JS Element
// If checkbox was NOT the direct Event.target
if (chk !== evt.target) {
chk.checked = !chk.checked; // toggle artificially the checkbox state
}
// Do the following on whoever was the Event.target
$tr.toggleClass("success", chk.checked);
});
.success { background: #0bf; }
<table id="myTable">
<tr>
<td>
<input type="checkbox" class="checkbox">
</td>
<td>
content
</td>
</tr>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
注意 if#myTable
是附加到当前或未来 tr
元素 的事件的静态delegateTarget处理程序$("#myTable")
,而不是使用而不是$(document)
作为静态选择器。
1争论为什么使用Event.target
优于:
取 ie: 一个元素,如饥似渴地等待事件触发通知,或关闭打开的模式,但从未注册它 - 导致用户界面损坏。Event.stopPropagation()
<body>
推荐阅读
- c# - 我能够从 ALM 获取文件夹,但不能从测试中获取 - c#
- gradle - 如何在具有不同名称和路径的自定义任务中创建多个 jar
- ios - UIButton 在 iOS 13 中作为 UITableViewCell 的辅助视图的位置错误
- html - 如何删除 MDBootstrap 类默认选择颜色
- android - 在具有 Mediatek MT6735P 芯片组和 Cortex-A53 CPU 的 64 位 armv8 设备上崩溃
- php - 如何获取嵌套在其他模型后面的存储数据
- reactjs - 子组件在 ReactJS 中使用父母的 Prop
- java - 使用 Amazon AWS SQS 实施 JMS onMessage() 可以降低成本吗?
- javascript - 如何在 javascript 中使用 aynsc/await 从异步操作返回对象
- python - 如何浏览图像并在 Python 中显示?