2011-08-22 88 views
0

我有一个自定义组件,它包含一个子图标。如果我将鼠标单击事件侦听器添加到组件(click-listener1)和图标(click-listener2),则分派的事件序列为click-listener2,然后单击listener1。我能理解它。但是,如果我将自定义事件添加到组件(listener1),并将鼠标单击事件添加到图标(listener2),则单击图标时,组件将分派自定义事件。在我的测试中,事件派发顺序是listener1,然后是listener2。它与事件泡泡规则不匹配。Flex内置事件和自定义事件的事件流程

在我看来自定义事件分派在listener2中,它触发了listener1。为什么事件流序列不是listener2,listener1?

组件中。

icon.addEventListener(MouseEvent.CLICK, iconClickHandler); 

    private function iconClickHandler(event:MouseEvent):void 
    { 
     trace ("Listener2"); 
     var customEvent:CustomEvent= new CustomEvent(CustomEvent.CUSTOM_EVENT, true, true); 
     dispatchEvent(customEvent) 
     trace ("Listener3"); 
    } 

在应用程序,其中包含组件

component.addEventListener(CustomEvent.CUSTOM_EVENT, customEventHandler); 

private function customEventHandler(event:CustomEvent):void { 
    trace ("Listener1"); 
} 

回答

0

UPD

你已经有了:

private function iconClickHandler(event:MouseEvent):void 
{ 
    trace("listener2"); 
    var customEvent:CustomEvent= new CustomEvent(CustomEvent.CUSTOM_EVENT, true, true); 
    dispatchEvent(customEvent); 
    trace("listener3"); 
} 


private function customEventHandler(event:CustomEvent):void 
{ 
    trace("listener1"); 
} 

MouseEvent.MOUSE_CLICK被分派,它触发第一幸运儿 - 它是你的组件功能iconClickHandler。这里我们追踪“listener2”并派遣自定义事件。

由于事件的性质syncronious,CUSTOM_EVENT监听器被触发立刻,这意味着分派事件,类似于调用监听功能。事件不会被存储在任何地方,它们也不会被延迟:在相同的线程中,事件的侦听器在同一控制流中立即触发。

CUSTOM_EVENT被调度,它的听众被触发 - 我们在控制台中调用了customEventHandler和“listener1”。

当所有侦听器都被触发时,控制返回到iconClickHandler并且“侦听器3”被追踪到控制台。

这就是为什么我们有输出:

listener2 
listener1 
listener3 
+0

其实iconClickHandler是LISTENER2。令我困惑的是CUSTOM_EVENT监听器比iconClickHandler发生的早,它派遣CUSTOM_EVENT –

+0

再次检查所有内容。确保:你的跟踪语句(或者你如何检查处理程序的顺序)是否正确编写,并排除混乱(在任何调用下一个dispatchEvent之前)。您的自定义事件名称与任何其他事件名称都不匹配;你的听众和事件有适当的冒泡和标题标志; – moropus

+0

是的,在iconClickHandler函数中,dipatched事件应该是customEvent。我修改了它。我通过Flash palyer调试来检查处理程序的顺序。订单是customEventHandler,iconClickHandler –