Implement the W3C DOM event model connecting JavaScript event handlers to the DOM tree.
Scope#
Event Interface#
Eventconstructor:new Event(type, options)event.type— event type string (e.g., "click")event.target— element that triggered the eventevent.currentTarget— element currently handling the eventevent.bubbles— boolean, whether event bubblesevent.cancelable— boolean, whether event is cancelableevent.defaultPrevented— booleanevent.eventPhase— 0 (NONE), 1 (CAPTURING), 2 (AT_TARGET), 3 (BUBBLING)event.timeStamp— timestamp of event creation
Event Methods#
event.preventDefault()— cancel the default actionevent.stopPropagation()— stop event from propagating furtherevent.stopImmediatePropagation()— stop even other handlers on same element
EventTarget Methods (on all DOM node wrappers)#
element.addEventListener(type, callback, options)— register handler- Support
captureoption (boolean or options object withcapturefield) - Support
onceoption (auto-remove after first invocation)
- Support
element.removeEventListener(type, callback, options)— unregister handlerelement.dispatchEvent(event)— dispatch event, return false if preventDefault was called
Event Propagation#
- Capture phase: traverse from document root to target, invoke capture listeners
- Target phase: invoke listeners on the target element
- Bubble phase: traverse from target back to root, invoke bubble listeners
- Respect
stopPropagation()andstopImmediatePropagation()
Event Storage#
- Store event listeners per-node (in the DOM or in a side table keyed by NodeId)
- Each listener entry: { type, callback (GcRef), capture (bool), once (bool) }
- Listeners must be GC roots while attached
Common Event Types#
- Support dispatching any string event type
- No built-in UI event dispatch yet (mouse, keyboard) — that comes with browser integration
- Focus on the infrastructure: registration, dispatch, propagation
Acceptance Criteria#
-
element.addEventListener("click", handler)registers a handler -
element.dispatchEvent(new Event("click"))invokes registered handlers - Event bubbles from target to document root
- Capture phase listeners fire before bubble phase
-
event.stopPropagation()halts propagation -
event.preventDefault()sets defaultPrevented -
removeEventListenercorrectly unregisters handlers -
once: trueoption auto-removes handler after first call -
event.targetandevent.currentTargetare set correctly during dispatch
Phase 11 — DOM-JS Bindings (issue 4 of 8). Depends on: issue 2 (DOM-JS bridge).