【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()++

相关推荐
不在逃避q30 分钟前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁44 分钟前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One9851 小时前
高进度算法模板速记(待完善)
java·前端·算法
陈随易1 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师2 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户059540174462 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈2 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen3 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒3 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端
梅孔立4 小时前
两种免费的翻译API调用方式详解 - Edge官方API与个人缓存服务
前端·缓存·edge