前端核心:彻底搞懂 JavaScript 事件流

在前端开发中,事件流是处理 DOM 交互的核心概念,它决定了事件在 DOM 树中的传播路径和触发顺序。理解事件流,是写出健壮、可维护交互代码的基础。

一、事件流与两个阶段说明

事件流描述的是当 DOM 元素触发事件后,事件在整个 DOM 树中的传播路径、顺序和触发规则。很多资料只提及 “捕获” 和 “冒泡” 两个阶段,而完整的事件流其实包含三个不可分割的阶段,且严格按照以下顺序执行:

  1. 事件捕获阶段:事件从最顶层的 document 开始,沿着 DOM 树向下传播,直到到达目标元素。
  2. 目标阶段:事件到达实际触发的目标元素。
  3. 事件冒泡阶段:事件从目标元素开始,沿着 DOM 树向上回溯,直到回到 document。

💡 注意:我们通常所说的 “两个阶段”,指的就是捕获阶段和冒泡阶段。

二、事件捕获

事件捕获是 从父元素到子元素(从顶层到目标)的传播过程,事件会优先触发外层祖先元素的事件处理函数,再逐层向下,直到到达目标元素的上层节点。
要绑定捕获阶段的事件,需要给 addEventListener() 方法传递第三个参数为 true(显式指定在捕获阶段触发)。

// 为父元素和子元素分别绑定捕获阶段的事件constparent=document.getElementById('parent');constchild=document.getElementById('child');parent.addEventListener('click',()=>{console.log('父元素捕获阶段触发');},true);// 第三个参数为true,表示在捕获阶段触发child.addEventListener('click',()=>{console.log('子元素捕获阶段触发');},true);

点击子元素时

父元素捕获阶段触发 子元素捕获阶段触发

三、事件冒泡:自下而上的默认传播

事件冒泡是从子到父的传播过程。在这个阶段,事件会从目标元素开始,依次向上触发每个父元素的事件处理函数,直到传播到 document。
这是浏览器的默认行为,也是我们日常开发中最常接触的阶段。

// 为父元素和子元素分别绑定冒泡阶段的事件constparent=document.getElementById('parent');constchild=document.getElementById('child');parent.addEventListener('click',()=>{console.log('父元素冒泡阶段触发');});// 第三个参数默认为false,表示在冒泡阶段触发child.addEventListener('click',()=>{console.log('子元素冒泡阶段触发');});

点击子元素时

子元素冒泡阶段触发 父元素冒泡阶段触发

四、阻止冒泡

在某些场景下,我们不希望事件向上冒泡,避免触发父元素的事件处理函数。这时可以使用 event.stopPropagation() 方法来阻止事件继续传播。

child.addEventListener('click',(event)=>{console.log('子元素冒泡阶段触发');event.stopPropagation();// 阻止事件向上冒泡});

点击子元素时

子元素冒泡阶段触发

父元素的事件处理函数不会被触发。

⚠️ 注意:event.stopPropagation() 只会阻止事件在冒泡或捕获阶段的传播,但不会阻止事件的默认行为(如链接跳转、表单提交)。如果需要同时阻止默认行为,可以使用 event.preventDefault()。

五、解绑事件

当 DOM 元素被销毁(如单页应用路由切换、弹窗关闭)或事件不再需要时,必须及时解绑事件监听,否则会导致内存泄漏,长期运行会降低应用性能。

1. 命名函数解绑

这是最常用的方式,需要确保绑定和解绑使用的是同一个函数引用。
核心要求:绑定和解绑必须使用同一个函数引用,命名函数是实现这一要求的最优方式。

// 定义命名函数functionhandleClick(){console.log('点击事件触发');}// 绑定事件child.addEventListener('click',handleClick);// 解绑事件child.removeEventListener('click',handleClick);

2. 匿名函数无法直接解绑

如果绑定事件时使用了匿名函数,将无法直接解绑,因为无法获取到函数的引用。

// ❌ 这种方式无法解绑child.addEventListener('click',()=>{console.log('匿名函数事件');});// 无法移除,因为匿名函数没有引用child.removeEventListener('click',()=>{});

3. 事件委托中的解绑

在使用事件委托时,通常只需要在父元素上解绑一次即可,不需要遍历所有子元素,这也是事件委托的性能优势之一。

总结

  • 事件流:包含捕获、目标、冒泡三个阶段,决定了事件的传播顺序。
  • 事件捕获:从 document 向下到目标元素。
  • 事件冒泡:从目标元素向上到 document,是默认行为。
  • 阻止冒泡:使用 event.stopPropagation() 避免事件向上传播。
  • 解绑事件:必须使用命名函数,确保引用一致,避免内存泄漏。
  • 掌握事件流的原理,能够让你在处理复杂交互时更加游刃有余,写出更高效、更可控的前端代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026 大专财务专业零基础能考的证书有哪些?

在数字技术日益融入各行各业的今天,传统职业的边界正在不断拓展与重构。对于财务专业的大专学生而言,这既意味着熟悉的领域正在发生深刻变化,也预示着个人发展拥有了更多新的可能性。当基础的核算工作越来越多地借助自动化工具完成时&#xf…

使用C++进行STM32开发

传统的STM32开发,使用的是C语言。C++中的一些高级特性,如引用、面向对象等,可以极大地提高代码的可读性和易维护性。 前置条件 开发板:STM32F103C8T6 开发环境:vscode+EIDE插件 编译器:arm-none-eabi-gcc v15.2.…

南京GEO优化系统怎么联系

南京GEO优化系统怎么联系?这里有你想要的答案在数字化营销时代,GEO优化系统成为众多企业提升品牌曝光、增加流量的有力工具。不少人在寻找南京的GEO优化系统,其中大麦GEO优化系统备受关注,下面就为你详细介绍并告诉你如何联系。大…

Java毕设项目推荐-基于 Web Service 技术的警务数据交互平台设计与实现【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

通信原理篇---FSK/MSK和MPSK/QAM

我会用“高速公路运输系统”的比喻,为你清晰地解释这场“调制制式之争”。核心矛盾:频谱效率 vs. 抗干扰能力无线通信就像在一条极其拥挤的无线电波“高速公路”上运输数据。我们有两个核心追求:频谱效率: 在单位带宽(…

Java毕设项目推荐-基于SpringBoot的校园设备维护报修系统基于springboot的高校教室设备故障报修信息管理系统【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

通信原理篇---多进制调制

我用一个“调制方式家族大比武”的比喻,为你一次讲清这五大数字调制技术的核心原理和特点。想象我们要用不同的方式,把一串0和1的“数字货物”装载到“载波卡车”上运走。一、MASK:多进制振幅键控(“用音量大小说话”)…

计算机Java毕设实战-基于springboot的高校教室设备故障报修信息管理系统校园报修维修系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

通信原理篇---数字基带信号PSD

我来为你讲解数字基带信号的功率谱密度。这是理解信号带宽和系统设计的核心概念。我们会用“能量分布地图”的比喻,让你直观掌握PSD的精髓。核心问题:信号的能量在哪里?想象你要分析一条繁忙高速公路上的车流能量。你可以数每天有多少辆车&am…

【课程设计/毕业设计】基于springboot框架的大学生体测管理系统基于SpringBoot的大学生体测数据管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

通信原理篇---白噪声与滤波器

核心模型:白噪声与滤波器首先,我们有一个无处不在的“背景噪音”——高斯白噪声。“白”: 像白光一样,在所有频率上功率谱密度均匀分布。记作 N0/2N0​/2(瓦/赫兹)。“高斯”: 在任意时刻&#…

通信原理篇---MSK

我来为你介绍MSK(最小频移键控)。它是数字调制中的一位“优雅的舞者”,以恒包络和相位连续而著称。让我们用最直观的方式来理解它。1. 核心目标:解决什么问题?想象之前的数字频率调制(FSK)&…

Java计算机毕设之基于Java+SpringBoot的高校教室设备故障报修信息管理系统基于springboot的高校教室设备故障报修信息管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

智能对话引擎接口性能优化:AI架构师的HTTP_GRPC协议选型与序列化方案对比

智能对话引擎接口性能优化:AI架构师的HTTP/GRPC协议选型与序列化方案对比 引言:为什么接口性能是智能对话的“生命线”? 想象一个场景:用户在手机上向智能助手发送“帮我订明天去上海的机票”,等待2秒后才收到回复——…

服务器安全:防火墙深度配置指南

在互联网环境下,任何一台拥有公网 IP 的服务器都时刻处于扫描器的监视之下。如果不进行任何限制,服务器的每一个端口都相当于一扇向黑客敞开的门。防火墙(Firewall) 作为操作系统内核与外部网络之间的过滤层,其核心任务…

Java毕设项目:基于springboot的高校教室设备故障报修信息管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Jmeter常用的断言

断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过。 常用的断言:响应断言、JSON断言、断言持续时间、XPath断言、BeanShell 断言一、响应断言1. 响应断言是最常用的一种断言方法,它可以对各种…

大盘风险控制策略分析报告 - 2026年01月16日 - 23:52:49

大盘风险控制策略分析报告 - 2026年01月16日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

【毕业设计】基于springboot的高校教室设备故障报修信息管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【课程设计/毕业设计】基于 Web Service 技术的警务数据交互平台设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…