The eventPhase property is a read-only integer that answers: “Which stage of the event trip am I in?” Learn NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE—plus how capture listeners differ from bubble ones—with five examples and try-it labs.
01
Kind
Instance property
02
Type
number (0–3)
03
Means
Flow phase now
04
Constants
Event.NONE …
05
Pairs with
capture / bubbles
06
Status
Baseline widely
Fundamentals
Introduction
When you click a nested button, the browser does not jump straight to that button and stop. The event travels: down from the window (capture), then at the element that was clicked (target), then back up (bubble) if the event bubbles.
event.eventPhase tells your handler which of those stages is active. Compare it with currentTarget (which listener) and bubbles (whether the trip back up happens).
💡
Beginner tip
Prefer the named constants Event.CAPTURING_PHASE, Event.AT_TARGET, and Event.BUBBLING_PHASE instead of magic numbers 1, 2, and 3.
Concept
Understanding Event.eventPhase
An instance property that reports the current evaluation phase of the event flow.
Event.NONE (0) — not being processed right now.
Event.CAPTURING_PHASE (1) — going down through ancestors (Window → … → parent).
Event.AT_TARGET (2) — at the event’s target.
Event.BUBBLING_PHASE (3) — going back up (only if bubbles is true).
Read-only — the browser sets it during dispatch.
Baseline Widely available on MDN (since July 2015); also in Web Workers.
Foundation
📝 Syntax
JavaScript
event.eventPhase
Value
An integer: 0–3, matching the Event.* phase constants above.
Typical pattern
JavaScript
const names = ["none", "capturing", "target", "bubbling"];
el.addEventListener("click", (event) => {
console.log(names[event.eventPhase]);
// e.g. "target" when this is the clicked element
}, false);
Event.eventPhase is marked Baseline Widely available on MDN (since July 2015). Logos use the shared browser-image-sprite.png sprite from this project. It is also available in Web Workers.
✓ Baseline · Widely available
Event.eventPhase
Read-only integer: which phase of the event flow is being evaluated (0–3).
UniversalWidely available
Google ChromeFull support · Desktop & Mobile
Full support
Mozilla FirefoxFull support · Desktop & Mobile
Full support
Apple SafariFull support · macOS & iOS
Full support
Microsoft EdgeFull support · Chromium
Full support
OperaFull support · Modern versions
Full support
Internet ExplorerSupported (legacy)
Full support
Event.eventPhaseExcellent
Bottom line: Use eventPhase with capture vs bubble listeners to understand—and debug—the full event trip.
Wrap Up
Conclusion
Event.eventPhase reports whether you are in capture, at the target, or bubbling. Pair it with currentTarget, target, and capture options on addEventListener to master DOM event flow.
Forget AT_TARGET for both capture and bubble regs on the target
Confuse phase with defaultPrevented
Rely on magic numbers without comments
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about eventPhase
The stage marker for capture, target, and bubble.
5
Core concepts
🔁01
Integer
0 to 3
API
⬇️02
Capture
phase 1
Down
🎯03
Target
phase 2
Center
⬆️04
Bubble
phase 3
Up
🎯05
Baseline
since Jul 2015
Status
❓ Frequently Asked Questions
It is a read-only integer on an Event that tells which phase of the event flow is running right now: NONE (0), CAPTURING_PHASE (1), AT_TARGET (2), or BUBBLING_PHASE (3).
No. MDN marks Event.eventPhase as Baseline Widely available (since July 2015). It is not Deprecated, Experimental, or Non-standard. It is also available in Web Workers.
Capture (useCapture true / { capture: true }) runs on the way down from Window toward the target. Bubble (the default) runs on the way back up—only if event.bubbles is true. At the target itself, eventPhase is AT_TARGET for both.
When the event is not being dispatched—for example before or after handlers run, or if you inspect an event object that is not currently flowing through the DOM.
eventPhase tells which stage of the trip you are in. currentTarget tells which element’s listener is running. Together they explain “where in the tree” and “which phase.”
Yes. If bubbles is false, capture still runs, then AT_TARGET, then bubbling is skipped. Processing finishes after the target phase.
Did you know?
Listeners registered on the same target with capture true and false both see eventPhase === Event.AT_TARGET. The capture vs bubble difference shows up on ancestors, not on the target itself.