stopPropagation在flex中不起作用

时间:2013-06-13 09:19:47

标签: flex events event-handling

我有一个根组件A和两个组件B,C,C是B的前面

B和C有EventListener

B.addEventLisener(MouseEvent.MouseDown,handler1);
C.addEventLisener(MouseEvent.MouseDown,handler2);

我希望当c抓住事件时它不会冒泡到B

我用

private function handler2(e:MouseEvent):void{
e.stopPropagation();
allowDraw = true;}
在handler2中

但它不起作用!

1 个答案:

答案 0 :(得分:2)

似乎,C和B是A的孩子。但是如果C不是B的孩子,它不会从C到B冒泡。冒泡只能从孩子到父母。但是如果B和C都是A的孩子而你在B之后添加了C,那么这并不意味着C成为B的孩子。

这就是事件处理程序按照添加顺序执行的原因。你有两个解决方案:

1.swap添加处理程序

C.addEventLisener(MouseEvent.MouseDown,handler2);
B.addEventLisener(MouseEvent.MouseDown,handler1);

2.使用event priorities

B.addEventLisener(MouseEvent.MouseDown,handler1, false, 10);
C.addEventLisener(MouseEvent.MouseDown,handler2, false, 20);

此外,stopPropagation也无效。你需要删除监听器。

<强> UPD

如果您不想删除侦听器,请使用boolean flag;

private function handler2(e:MouseEvent):void {
    e.stopPropagation();
    allowDraw = true;
    stop = true;
}

private function handler1(e:MouseEvent):void {
    if (stop) {
        stop = false;
        return;
    }
    //handler code
}