每做一次操作,控制台会输出事件链上发生了什么。
// 同一个点击,会从最外层往里「捕获」,再往外「冒泡」: // lvl1 捕获 → lvl2 捕获 → 目标 → lvl2 冒泡 → lvl1 冒泡 // 监听器挂在哪个元素,currentTarget 就是谁;e.target 始终是实际被点的那个
ul.addEventListener('click', (e) => {
const li = e.target.closest('.item') // 不管点中 li、文字还是 ×,都先回到条目
if (!li) return
if (e.target.closest('.del')) { li.remove(); return } // 点的是删除
li.classList.toggle('done') // 否则切换完成
})
link.addEventListener('click', (e) => {
e.preventDefault() // 取消默认跳转/滚动,然后自己决定做什么
// …例如:先校验、先弹确认框
})
input.addEventListener('keydown', (e) => {
console.log(e.key) // 'a'、'Enter'、'ArrowUp'、'Shift'…
if (e.key === 'Enter') { … } // 回车提交是最高频用法
})
zone.addEventListener('click', onZoneClick)
zone.removeEventListener('click', onZoneClick) // 必须传同一个函数引用才移除得掉
btn.addEventListener('click', handler, { once: true }) // 只响应一次,自动移除