1.先说一些基础的东西(直接从网上copy过来)
(1) 事件是一个对象,它由flash player产生和管理。事件流分捕获阶段,目标阶段和冒泡阶段。事件流的示意图如下,这里说明一下target和 currentTarget的概念。当一个事件流产生时,就产生了一个显示对象列表,而target是最里层的对象,而 currentTarget是捕获阶段和冒泡阶段被"遍历"的显示对象,当然它只有注册了时间监听器,我们才能获得 event.currentTarget。
2)
代码
- <1> 捕获阶段 (EventPhase.CAPTURING_PHASE)包括从舞台到目标节点范围内的所有节点
- <2> 目标阶段 (EventPhase.AT_TARGET)权包括目标节点
- <3> 冒泡阶段 (EventPhase.BUBBLING_PHASE)从目标节点的父节点返回到舞台的行程中遇到的节点
(3)不是所有的事件都有这三个阶段。如Timer、URLLoader, 它们的事件对象将直接派送给目标对象(target).它们只包含目标阶段而没有捕获阶段和冒泡阶段。它们不会像显示对象容器 (DisplayObjectContainer)那样有可能被一个DisplayObjectContainer对象包含或者自己包含一个 DisplayObjectContainer对象,它们往往是单独存在的。也就是说如果一个显示对象不在显示列表中时,FlashPlaye会把事件直 接派送给它,这个时候就没有事件流,也没有捕获阶段和冒泡阶段,只有目标阶段。
(1)请仔细看上面的图中的事件流,图中的假定的事件派发的对象是子节点1,从图中我们可以看出,事件流并没有经过子节点2,也就是说如果子节点2中监听事件,那子节点无法监听到事件。
(2)如果如果父节点监听子节点1的事件可以监督到吗?当然可以因为事件流有经过父节点;有两种方式可以监听到子节点1的事件:
自定义事件:
1)在父节点里面用子节点监听事件(如子节点1.addEventListener(。。。。))此时不需要设置addEventListener中的 useCapture参数和new Event时Event的bubbles参数。就可以直接监听到子节点1的事件,因为此时直接在目标阶段捕捉事件。
2)直接用在父节点中加入但是addEventListener(。。。)也可以监听子节点1的事件,但是前提条件是在父节点监听事件的时候要把 addEventListener中的useCapture参数设置成true(如 addEventListener(MenuEvent.MENU_Event, handler,true)或者字节点1中new Event时将Event的bubbles参数设置为true( new MenuEvent(MenuEvent.MENU_Event,true))。如果都不这样的话,父节点是无法监听到事件的。
因为addEventListener中的useCapture的default模式是false也就是侦听器只在目标或冒泡阶段处理事件,而 new Event时将Event的bubbles参数default也是false也就是说不参与事件流的冒泡阶段。如果不设置useCapture或者 bubbles为true那父节点肯定无法监听到事件。
(3)如果非要在子节点2中监听子节点1中发出的事件怎么办?
1)办法有很多种,说一下最常用的一种,就是向子节点1 与子节点2 都传入一个相同的对象的实例,在子节点1中用这个对象实例发出事件,在子节点2中用这个对象实例监听事件(在目标阶段捕获事件)。这样就可以收到字节点1的事件了。
非自定义事件(如mouseEvent):
1)当是非自定义事件时。直接用在父节点中加入但是addEventListener(。。。)就可以监听子节点1的事件。
2)有人可能要问如果我要在子节点2监听子节点1的非自定义事件呢?可以用(上面的2 标题里面 3)),但是完全没有必要,比如,你说你在子节点2中监听子节点1的mouseClick 事件干吗??