flex 事件机制 冒泡和捕获

发生事件时,该事件在事件流的三个阶段中移动:
捕获阶段,该阶段从显示列表层次结构的顶部流动到目标节点之前的节点;
目标阶段,该阶段只包括目标节点;
冒泡阶段,该阶段从目标节点的后续节点沿显示列表层次结构向上往回流动。
EventDispatcher 类实现 IEventDispatcher 接口,并且是 DisplayObject 类的基类。 EventDispatcher 类允许显示列表上的任何对象都是一个事件目标,同样允许使用 IEventDispatcher 接口的方法。
事件目标是 Flash ® Player 事件模型的重要组成部分。

事件目标是事件如何通过显示列表层次结构这一问题的焦点
当发生鼠标单击或按键等事件时,Flash Player 会将事件对象调度到从显示列表根开始的事件流中
然后该事件对象在显示列表中前进,直到到达事件目标,然后从这一点开始其在显示列表中的回程
在概念上,到事件目标的此往返行程被划分为三个阶段:
、、捕获阶段包括从根到事件目标节点之前的最后一个节点的行程,
、、目标阶段仅包括事件目标节点,
、、冒泡阶段包括回程上遇到的任何后续节点到显示列表的根。
通常,使用户定义的类能够调度事件的最简单方法是扩展 EventDispatcher。 如果无法扩展(即,如果该类已经扩展了另一个类),则可以实现 IEventDispatcher 接口,创建 EventDispatcher 成员,并编写一些简单的挂钩,将调用连接到聚合的 EventDispatcher 中。
二、说明 首先明确几个概念
1、显示列表根:假如你有abc 三个panel c在b中 b在a中这样的嵌套关系 那么c-->b-->a   a就是列表的根
2、目标:假如你在c上发了一个事件那么c就是事件的目标 有些复杂控件有click事件 不过发事件的目标不是它本身 那个currenttarget才是它本身
3、事件传递的流程:首先你派发事件在c上 事件首先从a-->b-->c-->b-->a这样一个完整的循环
4、捕获阶段:事件在a-->b的这个阶段(注意和b-->a不同)
5、目标阶段 仅当事件到达c的时候
6、冒泡阶段 b-->a这样经过的阶段
三、具体应用
当你在c上面派发了一个事件   然后你想在c的顶层a上监听到
你可能这么做
首先你在c上this.dispatchEvent(new Event("cevent",false)); 这样发了一个事件
蓝色字体 意味着这个事件只会在捕获和目标阶段 a->b->c
然后你在a上监听这个事件 a.addEventListener("cevent",function():void{trace("原始论坛目标发出的事件");},false);
红色字体 意味着你打算 让侦听器只在目标或冒泡阶段处理事件 就是c->b->a
四、简单说来就是 你发出的事件走的是a->b->c的阶段 而你侦听只想侦听b->a阶段c只走了一次所以不会检测到c的事件
任何一个false改成true就可以了
蓝色改成true意味着事件在所有过程传递
红色改成true意味着侦听捕获阶段
再简单说 新建事件不冒泡 默认侦听只侦听冒泡
原文地址:https://www.cnblogs.com/xinzhuangzi/p/4100569.html