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

相关推荐
2401_8858850420 小时前
易语言彩信接口怎么调用?E语言Post实现多媒体数据批量下发
前端
a11177620 小时前
Three.js 的前端 WebGL 页面合集(日本 开源项目)
前端·javascript·webgl
Kk.080220 小时前
项目《基于Linux下的mybash命令解释器》(一)
前端·javascript·算法
小李子呢021121 小时前
前端八股---闭包和作用域链
前端
IT_陈寒1 天前
Redis的内存溢出坑把我整懵了,分享这个血泪教训
前端·人工智能·后端
m0_738120721 天前
渗透测试基础ctfshow——Web应用安全与防护(五)
前端·网络·数据库·windows·python·sql·安全
Z_Wonderful1 天前
基于 Vite 的 React+Vue 混部完整模板(含目录结构、依赖清单、启动脚本)
前端·vue.js·react.js
Rooting++1 天前
腾讯无界微前端源码分析
前端
小嘿前端仔1 天前
用AI读源码这件事:前端视角的实战方法论,附Vue3 reactivity源码解读示范
前端
其实防守也摸鱼1 天前
XSS漏洞全景解析:从原理、实战利用到纵深防御
前端·网络·安全·xss·xss漏洞