🌰前情例子:
当在父容器设置了 @contextmenu.prevent(即在右键菜单事件中,设置了event.preventDefault(),阻止了浏览器的默认菜单),
那么如何开启该父容器下 ,某一个子元素的 浏览器右键菜单事件呢?
要知道,在事件控制、CSS属性设置中,虽然有类似"继承"概念,但子元素的优先级高于父元素的处理,可覆盖
学会如何灵活控制事件流,则能解决上述问题
⚙️深入理解事件流:
事件流的三个阶段
这里的核心在于,每个阶段都为我们提供了在不同层级捕获和处理事件的机会,从而实现复杂的交互逻辑。
- 捕获阶段 (Capture Phase): 事件从最外层的
window对象开始,顺着 DOM 树一层层向下流动,直到到达"目标元素"的上一个父元素。默认情况下,普通事件处理函数(不加 true**参数) 不会 在这个阶段触发 。 - 目标阶段 (Target Phase): 这是核心时刻。事件流流动到了用户点击的那个目标元素 (
event.target)本身。此时,绑定在目标元素上的点击事件处理函数会被触发。 - 冒泡阶段 (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()++