待办事项App勾选条目时触发列表删除的循环bug求助
问题解决:勾选列表项时整个列表被删除的循环问题
你的问题核心出在点击事件监听的代码里——else if(e.target.tagName === "SPAN")后面多了一个分号,这个分号让后续的删除代码块变成了独立执行的语句:不管你点击的是列表项(LI)还是关闭按钮(SPAN),甚至点击其他元素,这段删除代码都会强制运行。
当你点击LI(勾选圆圈)时,代码先执行了toggle("checked")标记选中状态,但紧接着就会执行e.target.parentElement.remove()。而LI的父元素正好是整个列表容器listContainer,所以整个列表直接被删掉了。刷新页面后,localStorage里保存的是之前带checked类的列表项,所以列表会重新出现,但再次点击LI时,错误逻辑又会触发删除,陷入无限循环。
修正后的完整代码
const inputBox = document.getElementById("input-box"); const listContainer = document.getElementById("list-container"); function addTask(){ if (inputBox.value === ''){ alert("You must write something!"); }else{ let li = document.createElement("li"); li.innerHTML = inputBox.value; listContainer.appendChild(li); let span = document.createElement("span"); span.innerHTML = "\u00d7"; li.appendChild(span); } inputBox.value = ""; saveData(); } listContainer.addEventListener("click", function(e){ if(e.target.tagName === "LI"){ e.target.classList.toggle("checked"); saveData(); }else if(e.target.tagName === "SPAN"){ // 移除了这里多余的分号 e.target.parentElement.remove(); saveData(); } }, false); function saveData(){ localStorage.setItem("data", listContainer.innerHTML); } function showTask(){ listContainer.innerHTML = localStorage.getItem("data"); } showTask();
额外优化建议
如果你的勾选圆圈是LI内部的子元素(比如<input type="checkbox">或自定义图标),点击圆圈时e.target.tagName不会是LI,会导致选中逻辑失效。可以把LI的判断改成以下写法,确保点击LI内部任何元素都能正确触发选中状态:
if(e.target.closest('LI')){ const li = e.target.closest('LI'); li.classList.toggle("checked"); saveData(); }
内容的提问来源于stack exchange,提问作者StavroStory
相关产品推荐
相关产品推荐

