flash事件机制

1.先说一些基础的东西(直接从网上copy过来)

(1) 事件是一个对象,它由flash player产生和管理。事件流分捕获阶段,目标阶段和冒泡阶段。事件流的示意图如下,这里说明一下target currentTarget的概念。当一个事件流产生时,就产生了一个显示对象列表,而target是最里层的对象, currentTarget是捕获阶段和冒泡阶段被"遍历"的显示对象,当然它只有注册了时间监听器,我们才能获得 event.currentTarget

2)

代码

  1. <1> 捕获阶段 (EventPhase.CAPTURING_PHASE)包括从舞台到目标节点范围内的所有节点  
  2.  <2> 目标阶段 (EventPhase.AT_TARGET)权包括目标节点  
  3.  <3> 冒泡阶段 (EventPhase.BUBBLING_PHASE)从目标节点的父节点返回到舞台的行程中遇到的节点  

(3)不是所有的事件都有这三个阶段。如TimerURLLoader 它们的事件对象将直接派送给目标对象(target).它们只包含目标阶段而没有捕获阶段和冒泡阶段。它们不会像显示对象容器 (DisplayObjectContainer)那样有可能被一个DisplayObjectContainer对象包含或者自己包含一个 DisplayObjectContainer对象,它们往往是单独存在的。也就是说如果一个显示对象不在显示列表中时,FlashPlaye会把事件直 接派送给它,这个时候就没有事件流,也没有捕获阶段和冒泡阶段,只有目标阶段。
 

1)请仔细看上面的图中的事件流,图中的假定的事件派发的对象是子节点1,从图中我们可以看出,事件流并没有经过子节点2,也就是说如果子节点2中监听事件,那子节点无法监听到事件。

2)如果如果父节点监听子节点1的事件可以监督到吗?当然可以因为事件流有经过父节点;有两种方式可以监听到子节点1的事件:

自定义事件:
    1
)在父节点里面用子节点监听事件(如子节点1.addEventListener(。。。。))此时不需要设置addEventListener中的 useCapture参数和new EventEventbubbles参数。就可以直接监听到子节点1的事件,因为此时直接在目标阶段捕捉事件。
    2
)直接用在父节点中加入但是addEventListener(。。。)也可以监听子节点1的事件,但是前提条件是在父节点监听事件的时候要把 addEventListener中的useCapture参数设置成true(如 addEventListener(MenuEvent.MENU_Event, handlertrue)或者字节点1new Event时将Eventbubbles参数设置为true new MenuEvent(MenuEvent.MENU_Event,true))。如果都不这样的话,父节点是无法监听到事件的。

因为addEventListener中的useCapturedefault模式是false也就是侦听器只在目标或冒泡阶段处理事件,而 new Event时将Eventbubbles参数default也是false也就是说不参与事件流的冒泡阶段。如果不设置useCapture或者 bubblestrue那父节点肯定无法监听到事件。
3)如果非要在子节点2中监听子节点1中发出的事件怎么办?
    1)
办法有很多种,说一下最常用的一种,就是向子节点1 与子节点2 都传入一个相同的对象的实例,在子节点1中用这个对象实例发出事件,在子节点2中用这个对象实例监听事件(在目标阶段捕获事件)。这样就可以收到字节点1的事件了。
 
非自定义事件(如mouseEvent):
   1
)当是非自定义事件时。直接用在父节点中加入但是addEventListener(。。。)就可以监听子节点1的事件。
   2
)有人可能要问如果我要在子节点2监听子节点1的非自定义事件呢?可以用(上面的2 标题里面 3)),但是完全没有必要,比如,你说你在子节点2中监听子节点1mouseClick 事件干吗??

猜你喜欢

转载自blog.csdn.net/woshixuhua/article/details/5836571
今日推荐