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

如何为createElement生成的元素制作删除按钮?原生JS待办列表开发问题

问题原因
  • 元素挂载层级错误:你现在把待办文本容器TodoDiv、编辑按钮、删除按钮三个独立元素直接插到了列表TodoList下,删除按钮的父元素是整个待办列表,点击删除时自然会把整个列表删掉
  • 点击目标判断漏判:如果点到了删除按钮内部的<i>图标,event.target就是i标签,不会匹配trashbtn类,判断逻辑就不会触发
  • HTML结构不符合规范:ul的直接子元素只能是li,你直接把按钮插在ul下既不符合语义,也加剧了层级混乱
修复代码

调整后的JS代码

//selectors!
const todoBtn = document.querySelector('.todo-button');
const TodoList = document.querySelector('.todo-list');
const todoInput = document.querySelector('.todo-input');

// event Listeners
todoBtn.addEventListener('click', Testgo);
TodoList.addEventListener('click', Testing);

//Functions!
function Testgo(event) {
  event.preventDefault();
  // 待办项根容器
  const TodoDiv = document.createElement('div');
  TodoDiv.classList.add('todoDiv');

  // 待办文本
  const newTodo = document.createElement('li');
  newTodo.innerText = todoInput.value;
  newTodo.classList.add('newTodo');
  TodoDiv.appendChild(newTodo);

  // 编辑按钮
  const TodoBtn = document.createElement('button');
  TodoBtn.classList.add('newbtn');
  TodoBtn.innerHTML = "<i class='fas fa-check'></i>";
  // 把按钮插到待办项容器里,不是直接插列表
  TodoDiv.appendChild(TodoBtn);

  // 删除按钮
  const TrashBtn = document.createElement('button');
  TrashBtn.classList.add('trashbtn');
  TrashBtn.innerHTML = "<i class='fas fa-trash'></i>";
  // 把按钮插到待办项容器里
  TodoDiv.appendChild(TrashBtn);

  // 只把整个待办项容器插到列表
  TodoList.appendChild(TodoDiv);

  todoInput.value = '';
}

function Testing(event) {
  const item = event.target;
  // 兼容点击图标场景,往上找最近的删除按钮
  const trashBtn = item.closest('.trashbtn');
  if (trashBtn) {
    // 找到待办项根容器直接删除
    const todoItem = trashBtn.closest('.todoDiv');
    todoItem.remove();
  }
}

调整后的HTML代码(修正类名多余的点,移除原有示例按钮避免干扰)

<header>
  <h1>ToDo</h1>
</header>

<form>
  <input type="text" placeholder="Add" class="todo-input" />
  <button id="button" class="todo-button" type="submit"><i class="fas fa-plus-square"></i></button>
</form>

<div class="test1">
  <p>hi</p>
</div>
<div class="test2">
  <p>ho</p>
</div>

<div class="todo-container">
  <ul class="todo-list">
  </ul>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:45:04