You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

待办事项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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:05:20