【Web八股】深入理解浏览器DOM事件流,灵活控制它!

🌰前情例子:

当在父容器设置了 @contextmenu.prevent(即在右键菜单事件中,设置了event.preventDefault(),阻止了浏览器的默认菜单),

那么如何开启该父容器下 ,某一个子元素的 浏览器右键菜单事件呢?

要知道,在事件控制、CSS属性设置中,虽然有类似"继承"概念,但子元素的优先级高于父元素的处理,可覆盖

学会如何灵活控制事件流,则能解决上述问题

⚙️深入理解事件流:

事件流的三个阶段

这里的核心在于,每个阶段都为我们提供了在不同层级捕获和处理事件的机会,从而实现复杂的交互逻辑。

  1. 捕获阶段 (Capture Phase): 事件从最外层的 window 对象开始,顺着 DOM 树一层层向下流动,直到到达"目标元素"的上一个父元素。默认情况下,普通事件处理函数(不加 true**参数) 不会 在这个阶段触发 。
  2. 目标阶段 (Target Phase): 这是核心时刻。事件流流动到了用户点击的那个目标元素 (event.target)本身。此时,绑定在目标元素上的点击事件处理函数会被触发。
  3. 冒泡阶段 (Bubble Phase): 目标元素处理完事件后,事件流开始反向运动。它沿着 DOM 树从目标元素的父元素一层层向上冒泡,直到再次回到 window 对象。绝大多数我们编写的事件处理逻辑(如点击按钮后的反应)都发生在这个阶段。

通俗来说,

我们监听函数,是 ++target.addEventListener(type, listener, useCapture)++;

  • 当你设置useCapture: false(默认值)的时候,捕获阶段不处理任何事件监听函数
  • 只有当设置useCapture: true 时,捕获阶段会拦截处理函数,不会再流入冒泡阶段

·++🌰:element.addEventListener('click', func, true)++

那么正常情况下,咱们点击一个元素,都是在冒泡阶段生效,从子元素开始找处理器、一直到父元素

但是如果你在事件监听处理函数中,调用了++event.stopPropagation()++ ,则会在冒泡阶段阻止事件的传播,不会再继续走完传播到window顶节点的整个向上链路了,也就不会再执行父元素的监听处理

✅解决前情例子的提问:

子元素设置@contextmenu.stop / ++event.stopPropagation()++

相关推荐
2分钟速写快排3 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github
Penge6665 小时前
JavaScript:BOM 详解
前端
Penge6665 小时前
Vite vs Webpack:前端构建工具原理与实战
前端
Penge6665 小时前
前端包管理工具:npm、Yarn、pnpm 快速入门
前端
Penge6666 小时前
Sass 了解
前端
Penge6666 小时前
Webpack 打包从 0 到 1 实战笔记
前端
Penge6666 小时前
Webpack 入门:是什么、为什么需要、怎么使用?
前端
Penge6667 小时前
Ant Design(Antd)了解
前端
wangruofeng7 小时前
同一行代码,百种渲染:Asuka、React Native 与 Flutter 跨平台渲染机制深度拆解
前端·github
爱学习的程序媛7 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架