当前位置: 首页 > news >正文

事件冒泡与捕获

一、事件流基础:事件冒泡与捕获的起源

  1. 事件流概念
    • 事件发生时在DOM节点上的传播顺序,触发一个节点的事件会连锁触发相关节点的事件。
  2. 两种对立模型
    • 事件捕获(微软提出):事件从文档根节点(如document)开始,逐级向目标节点传播,父节点先于子节点触发事件。
    • 事件冒泡(网景提出):事件从目标节点开始,逐级向根节点传播,子节点先于父节点触发事件。
  3. W3C统一模型
    • 采用“先捕获后冒泡”的流程:事件先从根节点捕获到目标节点(捕获阶段),再从目标节点冒泡回根节点(冒泡阶段)。

二、事件捕获(Event Capturing)

  1. 传播顺序
    • 从DOM树顶层(如documenthtmlbody)逐步向下到目标节点。
    • 例:点击<a>标签时,捕获顺序为documentdivpa
  2. 绑定事件方法
    • 使用addEventListener,第三个参数设为true
    element.addEventListener("click", handler, true); // 捕获阶段触发
    

三、事件冒泡(Event Bubbling)

  1. 传播顺序
    • 从目标节点开始,逐级向上到根节点。
    • 例:点击<a>标签时,冒泡顺序为apdivbodydocument
  2. 绑定事件默认行为
    • addEventListener第三个参数默认false(冒泡阶段触发),或直接使用onclick等属性绑定(默认冒泡):
    element.addEventListener("click", handler); // 等价于传入false,冒泡阶段触发
    element.onclick = handler; // 默认冒泡阶段触发
    

四、阻止事件传播

  1. 阻止捕获和冒泡
    • event.stopPropagation():终止事件在捕获和冒泡阶段的传播,后续节点的事件不再触发,但不影响当前节点的其他事件处理程序。
  2. 阻止同一节点的后续事件
    • event.stopImmediatePropagation():不仅阻止传播,还会中断当前节点上同一事件的其他事件处理程序执行(即使已绑定的事件)。

五、阻止默认事件行为

  1. 方法
    • event.preventDefault():取消事件的默认行为(如链接跳转、表单提交等)。
    • 兼容性:IE9及以下不支持,需用event.returnValue = false替代。
  2. 示例
    // 阻止链接跳转
    link.addEventListener("click", function(event) {event.preventDefault(); // 标准浏览器event.returnValue = false; // IE9及以下兼容
    });
    

六、核心知识点对比

特性事件捕获事件冒泡
传播方向根节点 → 目标节点目标节点 → 根节点
绑定参数addEventListener(..., true)addEventListener(..., false)(默认)
典型应用全局事件监听(如点击空白处关闭弹窗)事件代理(通过父节点统一处理子节点事件)
阻止方法作用
stopPropagation()阻止事件向父/子节点传播
stopImmediatePropagation()阻止传播并中断当前节点同事件的后续处理
preventDefault()阻止事件默认行为(如表单提交、链接跳转)

总结

  • 事件流流程:先捕获(根→目标),后冒泡(目标→根)。
  • 事件绑定:通过addEventListener的第三个参数控制阶段(true=捕获,false=冒泡)。
  • 事件控制stopPropagation()阻止传播,preventDefault()阻止默认行为,stopImmediatePropagation()额外中断同节点事件。
  • 应用场景:捕获适合全局控制,冒泡适合事件代理(减少内存占用),阻止方法用于避免事件干扰。
http://www.xdnf.cn/news/36883.html

相关文章:

  • 【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
  • JSAPI2.1-DOM基础
  • 使用Service发布前后端应用程序
  • 软件测试行业核心知识点的系统化梳理
  • 【Matlab】中国沿岸潮滩宽度和坡度分布
  • 2025年KBS SCI1区TOP:增强天鹰算法EBAO,深度解析+性能实测
  • 【数据结构_11】二叉树(3)
  • NestJS——使用TypeORM连接MySQL数据库(Docker拉取镜像、多环境适配)
  • 【大模型】 LangChain框架 -LangChain实现问答系统
  • 基于UNet算法的农业遥感图像语义分割(下)
  • AF3 unify_alignment_db_indices脚本解读
  • QT+Cmake+mingw32-make编译64位的zlib-1.3.1源码成功过程
  • Spring中的AOP基础理解
  • 探秘 C++ 内存管理:从虚拟内存到内存池的深度解析与实战应用
  • 【AI提示词】物理学家
  • 【信息系统项目管理师】高分论文:论信息系统项目的干系人管理(商业银行绩效考核系统)
  • 力扣算法ing(60 / 100)
  • 苍穹外卖项目中所涉及到的测试内容
  • 大模型Rag - 向量数据库索引
  • Docker应用端口查看器docker-port-viewer
  • 筑基挑战 | 第14期
  • 数字孪生火星探测车,星际探索可视化
  • 解码 Web Service:从技术原理到应用场景的深度剖析
  • 可以直接本地使用的Python环境可以调用的AI大模型归纳整理(AI辅助)
  • 如何防止接口被刷
  • 内积(Inner Product)
  • C#测试linq中的左连接的基本用法
  • 红黑树模拟实现STL中的map和set---C++
  • ThingsBoard3.9.1 MQTT Topic(3)
  • 【入门】数数小木块