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

JS待办列表如何添加前置复选框,勾选后文本划除仍保留在列表

问题根源

你之前通过document.createElement("input")创建的复选框元素没有插入到最终拼接的列表项模板中,属于无效代码不会渲染到页面。同时原有本地存储只保存待办纯文本,没有记录待办的完成状态,即便渲染出复选框,也无法持久化勾选状态、触发删除线样式。

实现步骤
  • 调整待办数据结构:将原有存储纯字符串的待办数组改为存储对象,每个待办项包含content(待办文本)、completed(完成状态,布尔值,默认false)两个字段,同时兼容本地存储中旧版本的纯字符串格式数据。
  • 修正渲染逻辑:删除无效的单独创建复选框DOM的代码,直接将复选框写入列表项的拼接模板中。给复选框绑定状态切换事件,勾选/取消时修改对应待办项的完成状态,更新本地存储后重新渲染列表。
  • 绑定完成态样式:给待办文本单独包裹标签,根据completed状态动态添加删除线样式类,勾选后文本显示删除效果,条目保留在列表内不被移除。
  • 适配原有新增、删除待办逻辑:新增待办时按新的对象结构存入数组,删除逻辑无需大改,保持原有操作数组、更新本地存储的流程即可。
参考代码

首先添加完成态的CSS样式:

.completed-task {
  text-decoration: line-through;
  color: #94a3b8;
}

修改后的完整功能代码:

// 复选框状态切换处理函数
function toggleTask(index) {
  const storageData = localStorage.getItem("New Todo");
  listArr = storageData === null ? [] : JSON.parse(storageData);
  // 翻转当前待办项的完成状态
  listArr[index].completed = !listArr[index].completed;
  localStorage.setItem("New Todo", JSON.stringify(listArr));
  showTasks();
}

function showTasks() {
  let getLocalStorage = localStorage.getItem("New Todo");
  if (getLocalStorage == null) {
    listArr = [];
  } else {
    listArr = JSON.parse(getLocalStorage);
    // 兼容旧版纯字符串格式的本地存储数据,自动转换为新的对象结构
    listArr = listArr.map(item => {
      if (typeof item === 'string') {
        return { content: item, completed: false }
      }
      return item
    })
  }
  const pendingNumb = document.querySelector(".pendingNumb");
  pendingNumb.textContent = listArr.length;
  listArr.length > 0 ? deleteAllBtn.classList.add("active") : deleteAllBtn.classList.remove("active");

  let newLiTag = "";
  listArr.forEach((element, index) => {
    // 复选框根据完成状态设置默认勾选,文本根据状态添加完成样式
    newLiTag += `
    <li>
      <input type="checkbox" ${element.completed ? 'checked' : ''} onchange="toggleTask(${index})">
      <span class="task-text ${element.completed ? 'completed-task' : ''}">${element.content}</span>
      <span class="delete-btn" onclick="deleteTask(${index})"><i class="fas fa-trash"></i></span>
    </li>`;
  });

  todoList.innerHTML = newLiTag;
  inputBox.value = "";
}

注意:需要同步修改你原有新增待办的逻辑,原来往数组里push纯文本的代码listArr.push(inputBox.value)要替换为对象结构:

listArr.push({
  content: inputBox.value.trim(),
  completed: false
})

删除单条、清空全部待办的逻辑不需要调整,保持原有操作数组、更新本地存储的写法即可正常运行。

实现效果
  • 每个待办项前正常渲染复选框,勾选后对应文本自动添加删除线、置灰,取消勾选即可恢复正常样式
  • 勾选状态会同步持久化到本地存储,刷新页面不会丢失状态
  • 勾选操作不会移除待办条目,只有点击删除图标才会删除对应项

内容的提问来源于stack exchange,提问作者Mayur Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:18:25