Skip to content

Files

Latest commit

 

History

History
20 lines (17 loc) · 871 Bytes

README.md

File metadata and controls

20 lines (17 loc) · 871 Bytes

#浏览器js事件研究

Add Event

EventListenerMap::add WebCore/dom/EventListenerMap.cpp

Dispatch Event

  • dispatchEventInDOM WebCore/dom/EventDispatcher.cpp
  • eventPath = [target, ...,HTMLBodyElement,HTMLHtmlElement,HTMLDocument,HTMLDocument],第2个HTMLDocument的currentTarget为DomWindow
  • Event:CAPTURING_PHASE eventPath [end,...,head -1] => handleEvent
  • Event:AT_TARGET eventPath [head] => handleEvent
  • Event:BUBBLING_PHASE eventPath [head -1,...,end] => handleEvent

Handle Event 中的特例

当at_target过程中的dom上同时绑定capture和bubbling事件时,事件是按照绑定顺序触发

  if (event.eventPhase() == Event::CAPTURING_PHASE && !registeredListener->useCapture())
      continue;
  if (event.eventPhase() == Event::BUBBLING_PHASE && registeredListener->useCapture())
      continue;