全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-16 8 分钟 ✍️ juanwangdev

事件处理与委托

JavaScript事件机制是前端交互核心,掌握事件流与委托模式至关重要。

事件流

三个阶段

阶段说明
捕获阶段从window向下传播到目标元素
目标阶段到达目标元素
冒泡阶段从目标元素向上冒泡到window

addEventListener 第三个参数

JavaScript
// 冒泡阶段(默认)
element.addEventListener('click', handler, false);

// 捕获阶段
element.addEventListener('click', handler, true);

事件对象

常用属性

JavaScript
element.addEventListener('click', function(e) {
    e.target;          // 触发事件的元素
    e.currentTarget;   // 绑定事件的元素
    e.type;            // 事件类型
    e.preventDefault(); // 阻止默认行为
    e.stopPropagation(); // 阻止冒泡
});

target vs currentTarget

JavaScript
ul.addEventListener('click', function(e) {
    console.log(e.target);        // 实际点击的li
    console.log(e.currentTarget); // ul本身
});

事件委托

基本原理

利用事件冒泡,在父元素上统一管理子元素事件。

JavaScript
// 传统方式:每个li绑定事件
document.querySelectorAll('li').forEach(li => {
    li.addEventListener('click', handler);
});

// 事件委托:父元素统一处理
ul.addEventListener('click', function(e) {
    if (e.target.tagName === 'LI') {
        console.log(e.target.textContent);
    }
});

匹配最近祖先元素

JavaScript
ul.addEventListener('click', function(e) {
    const li = e.target.closest('li');
    if (li) {
        console.log(li.dataset.id);
    }
});

动态元素处理

JavaScript
// 新增元素自动拥有事件处理
ul.addEventListener('click', function(e) {
    const btn = e.target.closest('.delete-btn');
    if (btn) {
        btn.parentElement.remove();
    }
});

// 动态添加元素
ul.insertAdjacentHTML('beforeend', '<li>新项</li>');

常见应用场景

表格操作

JavaScript
table.addEventListener('click', function(e) {
    const row = e.target.closest('tr');
    if (!row) return;

    if (e.target.classList.contains('edit')) {
        editRow(row.dataset.id);
    } else if (e.target.classList.contains('delete')) {
        deleteRow(row.dataset.id);
    }
});

按钮组

JavaScript
toolbar.addEventListener('click', function(e) {
    const btn = e.target.closest('button');
    if (!btn) return;

    const action = btn.dataset.action;
    switch(action) {
        case 'save': save(); break;
        case 'copy': copy(); break;
    }
});

注意事项

  • 事件委托依赖冒泡,focus/blur等不冒泡事件需使用捕获或focusin/focusout
  • 过度委托可能导致判断逻辑复杂,合理划分委托范围
  • e.target可能是子元素,使用closest()查找目标元素

要点总结

  • 事件流分为捕获、目标、冒泡三阶段
  • target是触发元素,currentTarget是绑定元素
  • 事件委托利用冒泡在父元素统一处理
  • 委托适合动态元素和大量相似元素场景
  • 使用closest()处理嵌套元素匹配

存放路径:articles/JS/进阶/浏览器与DOM高级/事件处理与委托.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 Web Workers与Service Workers
下一篇 → 性能优化与内存管理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库