我已经决定学习Java脚本,在看了几个教程后,我正在通过挑战来训练.其中一个标志性的挑战是列出待办事项 list .我知道有一些有答案的例子,但我想知道为什么我的代码不能工作……

问题似乎是我只能删除最后一个任务,而不能删除其他任务.我认为,出于同样的原因,当我选中除最后一个框之外的任何其他框时,文本装饰都不会出现(中间的线条).

PS:如果你对我的解决方案有任何 comments ,请不要犹豫,我渴望了解.

先谢谢你

const newTaskInput = document.getElementById("newTask");
const tasks = document.querySelector(".tasks");
let tasksCheckboxes = tasks.querySelectorAll("input[type='checkbox']");
let taskCount = 0;

//To add the new task in the content section
newTaskInput.addEventListener("keypress", (e) => {
  if (e.key == "Enter" && newTaskInput.value != "" && newTaskInput.value != undefined) {
    tasks.innerHTML += `
        <li id="${taskCount}-section">
            <input type="checkbox"  id="${taskCount}chk">
            <label class="label-for-${taskCount}" for="${taskCount}chk">${newTaskInput.value}</label>
            <input type="button" id="${taskCount}btn" value="x">
        </li>`;
    addListenerToCheckbox(taskCount);
    addListenerToButton(taskCount);
    newTaskInput.value = "";
    ++taskCount;

  }
})

const addListenerToCheckbox = (aTaskCount) => {
  const checkbox = document.getElementById(aTaskCount + "chk");
  const checkLabel = document.querySelector(`.label-for-${aTaskCount}`);

  checkbox.addEventListener("click", () => {
    if (checkbox.checked) {
      checkLabel.style.textDecoration = "line-through";
    } else {
      checkLabel.style.textDecoration = "none";
    }
  })
}

const addListenerToButton = (aTaskCount) => {
  console.log(taskCount);
  const taskBtn = document.getElementById(aTaskCount + "btn");
  const task = document.getElementById(aTaskCount + "-section");

  taskBtn.addEventListener("click", () => {
    console.log("gg");
    task.remove();
  })
}
<h1>To Do List:</h1>

<div class="box">
  <input type="text" id="newTask">
  <div class="content">
    <ul class="tasks"></ul>
  </div>
</div>

推荐答案

当您修改元素的innerHTML时,将丢失以前与其关联的所有事件处理程序.所以当你写下

tasks.innerHTML+=`
        <li id="${taskCount}-section">
            <input type="checkbox"  id="${taskCount}chk">
            <label class="label-for-${taskCount}" for="${taskCount}chk">${newTaskInput.value}</label>
            <input type="button" id="${taskCount}btn" value="x">
        </li>`;

你实际上是在做

tasks.innerHTML = tasks.innerHTML + `
        <li id="${taskCount}-section">
            <input type="checkbox"  id="${taskCount}chk">
            <label class="label-for-${taskCount}" for="${taskCount}chk">${newTaskInput.value}</label>
            <input type="button" id="${taskCount}btn" value="x">
        </li>`;

但事件处理程序不存储在任务innerHTML中.

删除按钮只对最后一个元素起作用的原因是,在修改元素的HTML之后添加了处理程序.

您可以通过避免对容器进行直接的HTML操作并将appendChild与createElement结合使用来避免这种情况.

修改后的代码将如下所示:

const task = document.createElement("li");
// Set the ID using DOM API
task.id = `${taskCount}-section`;
// Keep your previous content
task.innerHTML = `<input type="checkbox"  id="${taskCount}chk">
<label class="label-for-${taskCount}" for="${taskCount}chk">${newTaskInput.value}</label>
<input type="button" id="${taskCount}btn" value="x">`;
// This is key to fixing the issue you face here: We're not directly modifying the containers innerHTML, so all of our tasks will maintain their click handlers
tasks.appendChild(task);

在其他注释方面,您的HTML文件有一个不可靠的</div>,这不是有效的HTML.

另请参阅:addEventListener to innerHTML

Javascript相关问答推荐

在JS中获取名字和姓氏的首字母

获取表格的左滚动位置

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

如何使用侧边滚动按钮具体滚动每4个格?

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

使用i18next在React中不重新加载翻译动态数据的问题

如何为我的astro页面中的相同组件自动创建不同的内容?

如何从调整大小/zoom 的SVG路径定义新的d属性?""

在我的html表单中的用户输入没有被传送到我的google表单中

加载背景图像时同步旋转不显示的问题

使用ThreeJ渲染的形状具有抖动/模糊的边缘

我在Django中的视图中遇到多值键错误

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

try 使用javascript隐藏下拉 Select

Node.js错误: node 不可单击或不是元素

递归地将JSON对象的内容上移一级

浮动标签效果移除时,所需的也被移除

如何从嵌套的json中获取最大值

如何动态呈现适合未知屏幕大小的最大数量的表行?苗条的

带有JS模块模式的Rails的Importmap错误:";Net::ERR_ABORTED 404(未找到)&Quot;