eventphase是事件对象的只读属性,值为1(捕获阶段)、2(目标阶段)或3(冒泡阶段),反映当前事件处理函数执行时所处的传播阶段。

eventPhase 是事件对象上的一个只读属性,用于标识当前事件处理函数执行时所处的阶段。它的值是一个数字,对应三个预定义常量:
eventPhase 的三个取值及含义
- 1:表示 捕获阶段(CAPTURING_PHASE) —— 事件正从根节点向下传递,尚未到达目标元素;
- 2:表示 目标阶段(AT_TARGET) —— 事件已到达绑定事件监听器的那个元素本身;
- 3:表示 冒泡阶段(BUBBLING_PHASE) —— 事件正从目标元素向上逐层回传至祖先节点。
如何在事件处理中使用 eventPhase
直接访问事件对象的 event.eventPhase 即可判断当前阶段。注意:它反映的是「当前回调执行时」的阶段,不是事件注册时指定的阶段。
例如:
document.addEventListener('click', function(e) {
console.log('eventPhase:', e.eventPhase); // 可能是 1、2 或 3
});
若监听器注册在捕获阶段(第三个参数为 true),则可能在阶段 1 触发;若注册在冒泡阶段(默认或 false),则会在阶段 2 或 3 触发。
常见误区提醒
-
eventPhase ≠ addEventListener 的第三个参数:后者决定监听器是否参与捕获,但不改变
eventPhase的实际值; - 目标阶段(2)也会触发冒泡监听器:即使监听器是冒泡注册的,目标元素自身仍属于阶段 2,不是阶段 3;
-
捕获阶段监听器不会在目标阶段自动跳过:只要监听器注册在捕获路径上(比如父元素),且事件到达该元素,就会触发,此时
eventPhase === 2(如果该元素就是目标)或=== 1(如果只是中间节点)。
实用判断写法
可以用语义化方式增强可读性:
if (e.eventPhase === e.CAPTURING_PHASE) {
console.log('捕获中');
} else if (e.eventPhase === e.AT_TARGET) {
console.log('到达目标');
} else if (e.eventPhase === e.BUBBLING_PHASE) {
console.log('冒泡中');
}
浏览器支持良好,所有现代浏览器都实现了这三个常量和 eventPhase 属性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











