JS 特效 词条目录
前端Wiki/JS 特效/基础/性能与优化

事件委托

事件委托:利用事件冒泡,只在公共父元素上绑一个监听器,处理所有子元素的事件。加新列表项不用重新绑事件,内存与维护成本都低——做列表交互(删除、点赞、展开)的标配。

e.target 是真正被点的元素;判断它是不是目标子元素用 matches 或 closest。100 项的列表委托只需 1 个监听器,而不是 100 个。

  • e.target:真正触发事件的元素(冒泡到父元素)
  • closest("选择器"):找到最近匹配的祖先(含自己)
  • 动态加的子元素自动可交互,无需重新绑定
HTML
<style>
#todos { max-width: 340px; margin: 20px auto; list-style: none; padding: 0; }
#todos li { padding: 10px 14px; background: #f6f8fa; border-radius: 8px;
            margin: 6px 0; cursor: pointer; transition: .2s; }
#todos li.done { opacity: .4; text-decoration: line-through; }
#todos li .del { float: right; color: #e5534b; font-weight: 700; }
</style>
<ul id="todos">
  <li><span class="txt">学事件委托</span><span class="del">×</span></li>
  <li><span class="txt">写一个轮播</span><span class="del">×</span></li>
  <li><span class="txt">优化滚动性能</span><span class="del">×</span></li>
</ul>
<script>
document.getElementById('todos').addEventListener('click', function (e) {
  var li = e.target.closest('li'); if (!li) return;
  if (e.target.closest('.del')) li.remove();          // 点 × 删除
  else li.classList.toggle('done');                    // 点其它位置完成
});
// 动态加一条:不用绑事件也能交互
var ul = document.getElementById('todos');
var add = document.createElement('li');
add.innerHTML = '<span class="txt">后来加的任务,同样可点</span><span class="del">×</span>';
ul.appendChild(add);
</script>
本节要点事件委托 = 父元素一个监听器管所有子项;动态内容天然可交互。
🔗 相关词条事件DOMJavaScript