[DOM Event Learning] Section 4 事件分发和DOM事件流

[DOM Event Learning] Section 4 事件分发和DOM事件流

  

  事件分发机制: event dispatch mechanism.

  事件流(event flow)描述了事件对象在数据结构中是如何传播的.

传播路径

  事件对象(event objects)被分发给事件目标(event target),在分发开始的时候,在实现中必须先确定事件对象的传播路径.

  这个传播路径必须是一个有序的list,其中包含了事件对象必须通过的事件目标.

  对于DOM的实现来说,这个传播路径必须反映这个文档的分层树形结构, 路径list中的最后一个元素必须是该事件的目标元素(event target), 在这之前的所有元素被称为这个target的祖先(ancestor), 最接近target的一个祖先叫做它的parent.

  传播路径一旦确定,是不能被更改的. 对于DOM实现来说,即便是传播路径中的元素被移动或者删除, 此条规定也是生效的.

  在DOM事件流中, 在事件对象分发的过程中, event listeners可能会改变event target在document中的位置, 这样的改变不会影响传播路径.

  event listener中抛出的异常不能停止传播或者影响传播路径,异常不能传播到这个event handler之外.

Event phases

  Capture phase: 事件对象必须从Window一路传播到target的parent. 也叫capturing phase.

  Event listeners registered for this phase must handle the event before it reaches its target.

  Target phase: 事件对象必须到达它的target. 也叫at-target phase.

  Event listeners registered for this phase mush handle the event once it has reached its target.

  如果事件类型表明它不能冒泡,在这个阶段完成之后事件对象就停止了.

  Bubble phase: 冒泡阶段. 事件对象从target的parent开始,逆向向祖先传播,最后到达Window结束. 也叫bubbling phase.

  Event listeners registered for this phase must handle the event after it has reached its target.

  Event object必须完成一个或多个phases. 如果一个phase不被支持或者被停止, 则该阶段被忽略.

  比如Event.bubbles属性被置为false,表示不支持这个phase, 则这个phase被忽略.

  Event.stopPropagation()在dispatch之前被调用,所有的phases都会被忽略.

完成Phase

  实现中, 当有pending event targets在一个phase部分的传播路径中, 并且传播没有被Event.stopPropagation()停止, 必须让事件对象按下面的步骤完成一个event phase:

  首先, 实现必须确定当前的target.

  这个target必须是传播路径中的下一个pending event target,从第一个开始.

  对event listeners来说, 这个target必须是listener在它上面注册的那个.

  然后, 实现必须确定当前target的candidate event listeners.

  这个必须是当前target上所注册的所有event listener的一个list, 其中各个listener是按照注册顺序排序的.

  一旦确定之后, 这个list是不能被改变的, 增加或者移除listener不会影响当前目标对象的candidate event listeners.

  最后,实现中必须按顺序处理所有的candidate event handlers, 并且在下列条件都满足的时候激发每一个handler:

  1. The event object’s immediate propagation has not been stopped.

  2. This listener has been registered for this event phase.

  3. This listener has been registered for this event type.

  在产生传播路径的时候, event在capture phase从Window传到document对象, 在bubble phase从document对象传到Window.

  在event完成了传播路径中的所有phases之后, 它的Event.currentTarget必须被设置为null, Event.eventPhase必须被设置为0 (NONE).

  Event(或继承Event的其他接口)的所有其他属性都不变. 包括Event.target属性, 它必须还是指向event target.

  DOM Event flow就是上面这个模型的一个应用.

  所有的事件都完成了capture和target phases, 一个事件是否要完成bubble phase取决于每一个事件的类型.

  一些event listener有可能会引起其他事件的分发, 这样的事件是同步(synchronous)处理的. 也即, 第一个事件传播只有在新引起的事件分发完成之后才会resume.

参考链接

  https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html

  本文内容主要来自于其中的3.1 Event dispatch and DOM event flow

  该文章的参考资料列表:

  https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#references-DOMLS

  W3C的最新标准可以参见:

  http://www.w3.org/TR/

时间: 2024-10-07 06:06:55

[DOM Event Learning] Section 4 事件分发和DOM事件流的相关文章

[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个Event对象所表示,这个对象可能还会有一些自定义的字段或者方法,来获取发生什么事情的更多信息. Event对象实现了Event接口(https://developer.mozilla.org/en-US/docs/Web/API/Event). 事件可以是任何事情,从最基本的用户交互,到renderin

[DOM Event Learning] Section 1 DOM Event 处理器绑定的几种方法

[DOM Event Learning] Section 1 DOM Event处理器绑定的几种方法 网页中经常需要处理各种事件,通常的做法是绑定listener对事件进行监听,当事件发生后进行一些特定处理. 监听事件的几种方法如下文. 第一种,写在页面标签里面 <button onclick="alert('Hello')">Say hello</button> 上面这行代码,将按钮点击后的弹窗操作在标签声明的时候就绑定了. 这是一种糟糕的方法,原因如下: 1

Android事件分发机制——Touch事件

1. 简介 先来看一个表: Touch事件相关方法 功能 Activity ViewGroup View public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 Yes Yes Yes public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截 No Yes No public boolean onTouchEvent(MotionEvent ev) 事件响应 Yes Yes Yes 从

cocos2d-x 事件分发机制 ——加速计事件监听

加速计事件监听机制 在上一篇中介绍了cocos2d-x中的触摸事件机制,这篇来介绍下游戏中也经常用到的加速计事件,这些都是游戏中的经常要用到的. 移动设备上一个很重要的输入源是设备的方向,大多数设备都配备了加速计,用于测量设备静止或匀速运动时所受到的重力方向. 重力感应来自移动设备的加速计,通常支持X.Y和Z三个方向的加速度感应,又称为三向加速计.实际应用中,可以根据三个方向的力度大小来计算手机倾斜的角度和方向. 3.0机制中,我们只需要创建一个加速计监听器EventListenerAccele

cocos2d-x 事件分发机制 ——触摸事件监听

cocos2d-x 3.0 出来已经好久了,也已经用3.0写了几个小游戏,感觉3.0的事件触发机制太赞了,随这里总结一下,也算是对知识的一种回忆和加深理解. 3.0的事件分发机制中,需要也仅仅需要通过创建一个事件监听器来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有的事件监听器由这个分发器统一管理,即可完成事件响应. 事件监听器有以下几种: 1.EventListenerTouch(触摸事件) 2.EventListenerKeyboard(键盘响应事件) 3.

事件分发机制和事件传递机制

1. 触屏事件先传递给父容器的onInterceptTouchEvent方法(注:非容器没有onInterceptTouchEvent方法)return true,事件被消费,此次事件与子控件无关,onInterceptTouchEvent会陆续接收到ACTION_MOVE,ACTION_UP事件return false,事件优先传递给子控件处理 2. 子控件onTouchEvent接收到ACTION_DOWN事件,return true 子控件消费事件,事件不向上回传,onTouchEvent

左右JAVA示例代码事件分发和监督机制来实现-绝对原创有用

文章标题:左右JAVA示例代码事件分发和监督机制来实现 文章地址: http://blog.csdn.net/5iasp/article/details/37054171 作者: javaboy2012Email:[email protected]qq:    1046011462 一.场景如果 如果有博客系统中须要实现例如以下功能: 系统中用户公布文章.改动文章.删除文章时,须要一些相关的操作须要运行. 公布文章后,给好友发送邮件通知.给用户加积分,对文章做全文索引. 改动文章后,给好友发送邮

Android事件分发机制

转载请注明出处:http://blog.csdn.net/chziroy/article/details/44401615 要理解Android事件分发机制,首先得了解几个概念,也算是总结,如果暂时看不懂也无妨,本文会讲解这几个问题. 1,点击屏幕,首先事件的传递从Activity的dispatchTouchEvent()方法开始. 2,关于Android事件分发机制,相关方法的方法有三个:onTouchEvent(),dispatchTouchEvent(),还有onInterceptTouc

Cocos2d-X 3.x 事件分发机制详解

事件分发机制 新事件分发机制:在2.x 版本事件处理时,将要触发的事件交给代理(delegate)处理,再通过实现代理里面的onTouchBegan等方法接收事件,最后完成事件的响应.而在新的事件分发机制中,只需通过创建一个事件监听器-用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有事件监听器由这个分发器统一管理,即可完成事件响应.请参考更多3.0资料... 事件监听器有以下几种: 触摸事件 (EventListenerTouch) 键盘响应事件 (Event