我有一个表格,其中每一行都有一个复选框。我添加了一个简单的 JQuery 函数,使整行都可单击 - 当用户单击该行中的任意位置时,它会切换复选框。
我希望能够在 htmx 中使用这些复选框,但它似乎不起作用。单击复选框本身时,HTMX 网络调用似乎会触发并正常运行,但单击行中的其他位置不会触发 API 调用或 HTML 替换。有没有办法让 HTMX 在单击行中的任意位置时工作?
我所看到的问题的最小可重现示例:
<!DOCTYPE html>
<html lang="en">
<head>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src=" https://cdn.jsdelivr.net/npm/[email protected]/dist/htmx.min.js "></script>
</head>
<body>
<table class="table table-sm table-hover">
<thead>
<tr>
<th style="width: 30px"></th>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr class="clickable">
<td>
<input
class="form-check-input"
type="checkbox"
id="item-1"
hx-get="/api/test"
hx-target="#target"
/>
</td>
<td>Widget</td>
<td>$10</td>
</tr>
<tr class="clickable">
<td>
<input
class="form-check-input"
type="checkbox"
id="item-2"
hx-get="/api/test"
hx-target="#target"
/>
</td>
<td>Big Widget</td>
<td>$15</td>
</tr>
<tr class="clickable">
<td>
<input
class="form-check-input"
type="checkbox"
id="item-3"
hx-get="/api/test"
hx-target="#target"
/>
</td>
<td>Heavy Widget</td>
<td>$12</td>
</tr>
</tbody>
</table>
<div id="target"></div>
<script>
$(document).ready(function () {
$("tr.clickable").on("click", function () {
var $checkbox = $(this).find("input:checkbox");
$checkbox.prop("checked", !$checkbox.prop("checked"));
});
$("tr.clickable > td > input:checkbox").on(
"click",
function (event) {
event.stopPropagation();
}
);
});
</script>
</body>
</html>
您可以将 hx-get 和 hx-target 移动到
tr
元素,以便该行中的所有子元素都将开始进行 api 调用,因为 HTMX 支持继承。
然后定义一个函数,在单击行或复选框时选中和取消选中复选框。
<!DOCTYPE html>
<html lang="en">
<head>
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet"
/>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script src=" https://cdn.jsdelivr.net/npm/[email protected]/dist/htmx.min.js "></script>
</head>
<body>
<table class="table table-sm table-hover">
<thead>
<tr>
<th style="width: 30px"></th>
<th>Item</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr class="clickable" hx-get="/api/test" hx-target="#target">
<td>
<input
class="form-check-input"
type="checkbox"
id="item-1"
/>
</td>
<td>Widget</td>
<td>$10</td>
</tr>
<tr class="clickable" hx-get="/api/test" hx-target="#target">
<td>
<input
class="form-check-input"
type="checkbox"
id="item-2"
/>
</td>
<td>Big Widget</td>
<td>$15</td>
</tr>
<tr class="clickable" hx-get="/api/test" hx-target="#target">
<td>
<input
class="form-check-input"
type="checkbox"
id="item-3"
/>
</td>
<td>Heavy Widget</td>
<td>$12</td>
</tr>
</tbody>
</table>
<div id="target"></div>
<script>
$(document).ready(function () {
$("tr.clickable").on("click", function () {
var $checkbox = $(this).find("input:checkbox");
$checkbox.prop("checked", !$checkbox.prop("checked"));
});
$(".form-check-input").on("click", function () {
var $checkbox = $(this).find("input:checkbox");
$(this).prop("checked", !$(this).prop("checked"));
});
});
</script>
</body>
</html>