可通过event.eventphase属性判断事件阶段:1为捕获阶段,2为目标阶段,3为冒泡阶段;该属性只读,需在事件触发时检查,配合usecapture参数可精准控制监听时机。
在原生 javascript 中,可以通过事件对象的 event.eventphase 属性判断当前事件所处的阶段。
event.eventPhase 的三个可能值
eventPhase 是只读属性,返回一个整数,对应以下常量(定义在 Event 接口上):
- Event.CAPTURING_PHASE(值为 1):事件正处于捕获阶段
- Event.AT_TARGET(值为 2):事件到达目标元素(即绑定事件监听器的那个元素)
- Event.BUBBLING_PHASE(值为 3):事件正处于冒泡阶段
验证方法:在事件监听器中直接检查
只需在事件处理函数中读取该属性即可实时判断。注意:必须在实际触发事件时检查,不能提前预测。
element.addEventListener('click', function(e) {
if (e.eventPhase === Event.CAPTURING_PHASE) {
console.log('当前在捕获阶段');
} else if (e.eventPhase === Event.AT_TARGET) {
console.log('事件到达目标元素');
} else if (e.eventPhase === Event.BUBBLING_PHASE) {
console.log('当前在冒泡阶段');
}
});
配合 useCapture 参数更清晰地观察阶段
添加事件监听器时,通过第三个参数 useCapture 控制监听时机:
-
el.addEventListener('click', handler, true):仅在捕获阶段触发(此时e.eventPhase恒为 1) -
el.addEventListener('click', handler, false)或省略:仅在冒泡阶段触发(到达目标后,e.eventPhase为 2 或 3) - 若想全程观察,可在祖先和目标元素上分别添加捕获/冒泡监听器,并在每个 handler 中打印
e.eventPhase
常见误区提醒
- eventPhase 不等于 event.bubbles:后者只是说明该事件是否支持冒泡,与当前所处阶段无关
-
target 和 currentTarget 区别:即使在捕获或冒泡阶段,
e.target始终是最初触发事件的元素;而e.currentTarget是当前绑定监听器并执行 handler 的元素 - 自定义事件默认不冒泡(
bubbles: false),需显式设置才进入冒泡阶段











