js 不会冒泡的事件有哪些
在 JavaScript 中,大多数事件会冒泡(即从触发元素向上传递到文档根),但有一些事件不会冒泡。以下是一些常见的不会冒泡的事件:
1. 焦点相关事件
focus (元素获得焦点)
blur (元素失去焦点)
focusin (会冒泡的替代事件)
focusout (会冒泡的替代事件)
2. 鼠标进入/离开事件
mouseenter (鼠标进入元素)
mouseleave (鼠标离开元素)
对比:
mouseover 和 mouseout 会冒泡,但 mouseenter 和 mouseleave 不会。
3. 加载和错误事件
load (资源加载完成,如 <img>、<script>)
unload (页面或资源卸载)
error (资源加载失败,如 <img> 的 src 无效)
abort (资源加载中止,如用户停止图片加载)
例外:
这些事件通常直接在目标元素上触发,不会向上传递。
4. 其他特殊事件
resize (窗口或元素大小改变)
scroll (元素滚动时触发)
注意:
虽然 resize 和 scroll 不会冒泡,但它们可以通过在特定元素(如 window)上监听来捕获。
为什么这些事件不冒泡?
避免意外行为:例如 focus 和 blur 不冒泡是为了防止父元素意外拦截焦点逻辑。
性能优化:像 mouseenter/mouseleave 不冒泡可以减少不必要的事件处理。
如何强制监听不冒泡的事件?
如果需要在父元素监听这些事件,可以通过:
1、使用捕获阶段(将事件监听器的第三个参数设为 true):
parent.addEventListener('focus', handler, true); // 捕获阶段触发
2、改用冒泡替代事件(如用 focusin 代替 focus)。
浙公网安备 33010602011771号