最后,通过代码再一次体验Flex的"事件之旅"。依然以信号灯的应用为基础,经过改造的应用代码见代码6-7,新的项目名为EventJourney。
代码6-7: EventJourney项目代码
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function initApp():void {
btnRed.addEventListener(MouseEvent.CLICK,myEventHandler);
traficLight.addEventListener(MouseEvent.CLICK,myEventHandler);
ctnButtons.addEventListener(MouseEvent.CLICK,myEventHandler);
lblLightInfo.addEventListener(MouseEvent.CLICK,myEventHandler);
this.addEventListener(MouseEvent.CLICK,myEventHandler);
//在捕获阶段调用EventListener
btnRed.addEventListener(MouseEvent.CLICK,myEventHandler,true);
traficLight.addEventListener(MouseEvent.CLICK,myEventHandler,true);
ctnButtons.addEventListener(MouseEvent.CLICK,myEventHandler,true);
lblLightInfo.addEventListener(MouseEvent.CLICK,myEventHandler,true);
this.addEventListener(MouseEvent.CLICK,myEventHandler,true);
}
private function myEventHandler(event:Event):void {
trace(event.currentTarget.toString() + " 在事件阶段" + event.eventPhase);
}
]]>
</mx:Script>
|
在initApp()方法中,我们为btnRed、traficLight、ctnButtons、lblLightInfo和Application本身(通过this)分两次注册了同一个侦听器myEventHandler。第二次注册中,我们设置use_capture参数为true。
在myEventHandler中使用trace方法输出了侦听器被调用时的当前节点对象和事件所在阶段。事件属性event.eventPhase标志着当前所处事件旅程的阶段。返回值为unit类型,包含了代表着三个阶段的numeric值。分别为:
捕获阶段:EventPhase.CAPTURING_PHASE=1;
目标阶段:EventPhase.AT_TARGET=2;
冒泡阶段:EventPhase.BUBBLING_PHASE=3。
在按下红色按钮后,输出结果如代码6-8所示。
代码6-8: EventJourney项目代码输出结果
EventJourney0 在事件阶段1 EventJourney0.traficLight 在事件阶段1 EventJourney0.traficLight.ctnButtons 在事件阶段1 EventJourney0.traficLight.ctnButtons.btnRed 在事件阶段2 EventJourney0.traficLight.ctnButtons 在事件阶段3 EventJourney0.traficLight 在事件阶段3 EventJourney0 在事件阶段3 |
关于结果的说明:
尽管我们为btnRed按钮注册了两次侦听器,但是由于Flash Player只在目标阶段检查该按钮,因此侦听器只在目标阶段被调用一次;
尽管我们为lblLightInfo标签也注册了侦听器,但由于该对象并不在事件旅程覆盖的节点中,因此不会产生任何输出。



