eventPhase是事件对象的只读属性,返回1(捕获阶段)、2(目标阶段)或3(冒泡阶段)以精确标识事件当前所处的物理阶段,无需逻辑推断,零延迟、无歧义。

eventPhase 是事件对象上的只读属性,返回一个整数,直接反映当前事件所处的**物理阶段**(捕获、目标、冒泡),无需额外判断逻辑,真正做到“秒级判定”。
eventPhase 的三个取值及含义
它只有三个可能值,对应事件流的三个物理阶段:
- 1:表示 CAPTURING_PHASE(捕获阶段)——事件正从 window 向目标元素逐层向下传递
- 2:表示 AT_TARGET(目标阶段)——事件已到达绑定监听器的那个元素本身(注意:若在目标元素上同时注册了捕获和冒泡监听器,目标阶段会触发两次)
- 3:表示 BUBBLING_PHASE(冒泡阶段)——事件正从目标元素向上逐层回传至 window
实际判定技巧:一行代码即可
在事件处理函数中,直接读取 e.eventPhase,用严格相等或 switch 判断即可:
element.addEventListener('click', function(e) {
if (e.eventPhase === 1) console.log('正在捕获');
else if (e.eventPhase === 2) console.log('击中目标');
else if (e.eventPhase === 3) console.log('正在冒泡');
});
不需要查 e.target 和 e.currentTarget 是否相等,也不依赖 useCapture 参数——eventPhase 是事件此刻真实所处阶段的客观快照。
易混淆点提醒
-
e.eventPhase === 2仅说明“当前回调正在目标节点上执行”,不表示该监听器是绑定在目标上的——它可能是父元素在捕获/冒泡阶段监听到的,但因目标阶段特殊规则而触发 - 同一个事件在不同监听器中,
eventPhase值可能不同。例如:父元素捕获监听器里是1,目标元素自身监听器里是2,父元素冒泡监听器里是3 - 调用
e.stopPropagation()不会影响已进入目标阶段的事件,但会阻止后续阶段(如阻止捕获后无法到达目标,阻止目标后无法冒泡)
为什么说它是“物理阶段”而非“行为阶段”
因为 eventPhase 反映的是 DOM 规范定义的事件传播路径中的**真实位置**,与开发者是否显式启用捕获、是否调用阻止方法无关。它不是靠推断来的,而是浏览器内核在调度每个监听器时实时填入的底层状态值——所以判定零延迟、无歧义、可信赖。

















