webkit dom 事件分析

webkit dom事件分析

Dom事件模型可以分为dom0 和dom2两种事件模型,所以支持JavaScript的浏览器都都会支持dom0事件模型,DOM2定义了高级的事件处理API,和DOM0的API相比,有着令人瞩目的不同(而且功能更强大).虽然DOM2标准并没有把已有的API收入其中,但是DOM0级API也没有被去除.对于基本的事件处理任务,你会觉得使用这些简单的API更自由一些.

DOM2事件模型被除了IE以外的所有浏览器支持。

webkit在这部分的设计中,较好的这两种事件模型统一了起来,在注册的部分,稍有不同,我们知道,dom0的事件监听器是通过html属性注册,而dom2是通过类似ja elem.addEventListener()的方式,下面是一个相关的类图。

EventTarget直接依赖于EventListener,EventListener是一个抽象类,然后具体的监听器在下面派生,注意,JSEventListener,以及JSLazeEventListener是与具体的js解释引擎有关系的。那么事件监听器的注册的流程是怎么样的了?下面以body的onload为例进行说明。

DOMWindow中,addEventListener的实现如下:

  1. boolDOMWindow::addEventListener(constAtomicString&eventType,PassRefPtr<EventListener>listener,booluseCapture)
  2. {
  3. if(!EventTarget::addEventListener(eventType,listener,useCapture))
  4. returnfalse;
  5. if(Document*document=this->document())
  6. document->addListenerTypeIfNeeded(eventType);
  7. if(eventType==eventNames().unloadEvent)
  8. addUnloadEventListener(this);
  9. elseif(eventType==eventNames().beforeunloadEvent&&allowsBeforeUnloadListeners(this))
  10. addBeforeUnloadEventListener(this);
  11. #ifENABLE(DEVICE_ORIENTATION)
  12. elseif(eventType==eventNames().devicemotionEvent&&frame()&&frame()->page()&&frame()->page()->deviceMotionController())
  13. frame()->page()->deviceMotionController()->addListener(this);
  14. elseif(eventType==eventNames().deviceorientationEvent&&frame()&&frame()->page()&&frame()->page()->deviceOrientationController())
  15. frame()->page()->deviceOrientationController()->addListener(this);
  16. #endif
  17. returntrue;
  18. }

webkit dom事件分析

Dom事件模型可以分为dom0 和dom2两种事件模型,所以支持JavaScript的浏览器都都会支持dom0事件模型,DOM2定义了高级的事件处理API,和DOM0的API相比,有着令人瞩目的不同(而且功能更强大).虽然DOM2标准并没有把已有的API收入其中,但是DOM0级API也没有被去除.对于基本的事件处理任务,你会觉得使用这些简单的API更自由一些.

DOM2事件模型被除了IE以外的所有浏览器支持。

webkit在这部分的设计中,较好的这两种事件模型统一了起来,在注册的部分,稍有不同,我们知道,dom0的事件监听器是通过html属性注册,而dom2是通过类似ja elem.addEventListener()的方式,下面是一个相关的类图。

EventTarget直接依赖于EventListener,EventListener是一个抽象类,然后具体的监听器在下面派生,注意,JSEventListener,以及JSLazeEventListener是与具体的js解释引擎有关系的。那么事件监听器的注册的流程是怎么样的了?下面以body的onload为例进行说明。

DOMWindow中,addEventListener的实现如下:

  1. boolDOMWindow::addEventListener(constAtomicString&eventType,PassRefPtr<EventListener>listener,booluseCapture)
  2. {
  3. if(!EventTarget::addEventListener(eventType,listener,useCapture))
  4. returnfalse;
  5. if(Document*document=this->document())
  6. document->addListenerTypeIfNeeded(eventType);
  7. if(eventType==eventNames().unloadEvent)
  8. addUnloadEventListener(this);
  9. elseif(eventType==eventNames().beforeunloadEvent&&allowsBeforeUnloadListeners(this))
  10. addBeforeUnloadEventListener(this);
  11. #ifENABLE(DEVICE_ORIENTATION)
  12. elseif(eventType==eventNames().devicemotionEvent&&frame()&&frame()->page()&&frame()->page()->deviceMotionController())
  13. frame()->page()->deviceMotionController()->addListener(this);
  14. elseif(eventType==eventNames().deviceorientationEvent&&frame()&&frame()->page()&&frame()->page()->deviceOrientationController())
  15. frame()->page()->deviceOrientationController()->addListener(this);
  16. #endif
  17. returntrue;
  18. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值