当一个事件触发会有三个阶段让程序捕获:
第一阶段:事件的捕获阶段
下一个:目标捕获阶段
最终:冒泡捕获
1)事件捕获阶段
捕获顺序是自祖先组件到事件触发组件层层执行的。比如下面一个层次关系的执行顺序为:先检查Application是否有监听器,再是Pannel最后是TitleWindow。
Application Panel TitleWindow Button(bt1) 捕获这个阶段的事件是需要设置addEventListener的第三个参数为true的,也就是addEventListener(event-name,eventHandler,useCapture=true); 关于本阶段监听器的参数Event对象有两个属性的变化值得注意。一个是target,它一直引用着触发事件的对象。currentTarget始终引用的是当前处理事件的节点的对象。例如:在每个对象上全部加上监听监听: bt1.addEventListener(Mouse_Event.MOUSE_DOWN,'eventHandler',true);其他省略。。。public funtion eventHandler(e:Event):void { mx.controls.Alert.show(e.currentTarget.id); mx.controls.Alert.show(e.target.id);}看可以看出target以及currentTarget的变化情况。第三个阶段也是如此测试。目标捕获阶段 这个阶段只执行事件触发对象的listener,target和currentTarget指向同一个对象--事件触发者。冒泡阶段 没什么好说的,只不过要想捕获这个阶段的事件必须把setEventListener的useCapture值得设为false,这点跟第一个阶段相反,而且他们的捕获顺序也相反,在这个阶段,事件的触发顺序是从事件触发者开始,逐层向上传递。target和currentTaget变化情况同第一阶段。差点忘了,在事件的任何阶段,你都可以调用
stopPropagation()
stopImmediatePropagation()
来停止事件的继续传递,但他们产生的效果是不一样的。
stopPropagation(),事件传递给下一个对象,并继续执行当前节点的其他事件捕获。
stopImmediatePropagation(),事件传递给下一个对象,但同时停止执行当前节点的其他事件捕获。
复制个例子:
<?xml version="1.0"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init(event)"> <mx:Script><![CDATA[ import mx.controls.Alert; import flash.events.MouseEvent; import mx.events.Event; public function init(e:Event) { p1.addEventListener(MouseEvent.MOUSE_DOWN,showAlert); tw1.addEventListener(MouseEvent.MOUSE_DOWN,showAlert); tw1.addEventListener(Event.CLOSE,closeWindow); } public function showAlert(e:Event) { Alert.show("Alert!\n" + e.currentTarget + "\n" + e.eventPhase); e.stopImmediatePropagation(); } public function closeWindow(e:Event) { p1.removeChild(tw1); } ]]></mx:Script> <mx:Panel id="p1" title="Panel 1"> <mx:TitleWindow id="tw1" width="300" height="300" showCloseButton="true" title="Title Window 1"> <mx:Button label="Enter name"/> <mx:TextArea id="ta1"/> </mx:TitleWindow> </mx:Panel></mx:Application>