在 JSP 中使用 <c:forEach> 迭代生成多個刪除按鈕,嘗試用 JavaScript 根據 dto.user_type 動態控制顯示/隱藏:
<c:forEach items="${list}" varStatus="state" var="dto">
<input style="display:" class="btn btn-block btn-red" id="del" name="${dto.user_type}" value="刪除" onclick="">
</c:forEach>
原始 JS 代碼:
function test() {
var pdb = document.getElementById("del"); // 只能獲取第一個元素
// ...
}
HTML 標準規定 id 屬性在文檔中必須唯一。forEach 生成多個 id="del" 導致重複,getElementById 僅返回首個匹配元素,其餘被忽略。
<c:forEach items="${list}" var="dto">
<input type="button" class="del-btn" data-user-type="${dto.user_type}" value="刪除">
</c:forEach>
<script>
document.querySelectorAll('.del-btn').forEach(function(btn) {
if (btn.dataset.userType === '0') {
btn.style.display = 'inline-block';
} else {
btn.style.display = 'none';
}
});
</script>
<c:forEach items="${list}" varStatus="vs" var="dto">
<input id="del_${vs.index}" name="${dto.user_type}" ...>
</c:forEach>
JS 中需遍歷索引查找,不如方案一優雅。
<c:forEach items="${list}" var="dto">
<input type="button" class="btn btn-block btn-red"
style="display: ${dto.user_type == '0' ? 'inline-block' : 'none'}"
value="刪除">
</c:forEach>
最簡潔,避免前端邏輯複雜度。
data-* 屬性攜帶業務數據,避免濫用 name/valuedocument.body.addEventListener('click', e => { if(e.target.matches('.del-btn')) ... })refreshDelButtons() 於 AJAX 完成後調用迴圈生成 DOM 元素時,**嚴禁重複 id**。善用 class + data-* 屬性或後端直接渲染樣式,是解決此類問題的標準模式。