JSP 循環輸出 10 條記錄,每行首列含複選框。點擊「保存」按鈕時需:

<table id="tableid">
<c:forEach items="${list}" var="item">
<tr>
<td><input type="checkbox" name="ids" value="${item.id}" /></td>
<td>${item.name}</td>
</tr>
</c:forEach>
</table>
<input type="button" id="save" value="保存" onclick="checkChecked()" />
<script>
function checkChecked() {
const inputs = document.getElementById('tableid').getElementsByTagName('input');
let checked = 0, notchecked = 0;
for (let i = 0; i < inputs.length; i++) {
if (inputs[i].type === 'checkbox') {
inputs[i].checked ? checked++ : notchecked++;
}
}
alert('已勾選:' + checked);
alert('未勾選:' + notchecked);
// 業務邏輯示例
if (notchecked > 0) {
if (!confirm(`尚有 ${notchecked} 條未勾選,確定保存?`)) return;
}
// 提交表單或 AJAX...
}
</script>
function checkChecked() {
const $chk = $('#tableid input[type="checkbox"]');
const checked = $chk.filter(':checked').length;
const notchecked = $chk.length - checked;
alert(`已勾選:${checked},未勾選:${notchecked}`);
if (notchecked > 0 && !confirm(`尚有 ${notchecked} 條未勾選,確定保存?`)) return;
// $('#formId').submit();
}
<th><input type="checkbox" id="checkAll" /></th>
<script>
$('#checkAll').click(function() {
$('#tableid input[name="ids"]').prop('checked', this.checked);
});
| 現象 | 原因 | 解決 |
|---|---|---|
| 統計數量為 0 | 表格無 id="tableid" 或選擇器錯誤 | 檢查 HTML 結構與 JS 選擇器一致性 |
| 動態新增行不生效 | 事件綁在靜態元素上 | 改用事件委託 $(document).on('click', '#tableid input', ...) |
| 提交時未勾選值也被發送 | 未勾選的 checkbox 不會隨表單提交 | 屬於 HTML 標準行為,無需處理 |
id,避免全局選擇器污染type="button" 防止誤觸發表單提交通過 getElementsByTagName 或 jQuery 選擇器遍歷 input[type=checkbox],即可輕鬆統計勾選狀態。核心邏輯不足 10 行,關鍵在於「精準定位表格範圍」與「區分業務必選與可選」。