Apache flex 停止广播不';我不能在flex中工作

Apache flex 停止广播不';我不能在flex中工作,apache-flex,events,event-handling,Apache Flex,Events,Event Handling,我有一个根分量a和两个分量B,C在B前面 B和C有事件监听器 B.addEventLisener(MouseEvent.MouseDown,handler1); C.addEventLisener(MouseEvent.MouseDown,handler2); 我想当c捕捉到事件时,它不会冒泡到B 我用 private function handler2(e:MouseEvent):void{ e.stopPropagation(); allowDraw = true;} 在handler2

我有一个根分量a和两个分量B,C在B前面

B和C有事件监听器

B.addEventLisener(MouseEvent.MouseDown,handler1);
C.addEventLisener(MouseEvent.MouseDown,handler2);
我想当c捕捉到事件时,它不会冒泡到B

我用

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

在handler2中,但它不起作用

看起来,C和B是A的子对象。但如果C不是B的子对象,它就不会从C冒泡到B。冒泡只能从子对象到父对象。但是如果B和C都是A的孩子,你在B之后加上C,这并不意味着C变成了B的孩子

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

1.交换添加处理程序

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

此外,
stopPropagation
也不起作用。您需要删除侦听器

UPD

如果不想删除侦听器,请使用布尔标志

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
}

您的第一个解决方案不可能,因为我的程序的逻辑和关于您的第二个解决方案:handler1仍在调用吗?@sami是的,您需要执行B.removeEventListener(MouseEvent.MOUSE_DOWN,handler1);真糟糕!我不能这样做!我需要B和C一直都有它们的事件侦听器:(这个方法会是另一个解决方案吗?我不太经常这么做,但它看起来像是另一个解决方案(在这里发布的这个解决方案似乎也不错!)@Timofei这是一个很好的解决方案,但不幸的是,它不能解决我的问题,因为B和C是两个独立的组件,不可能将停止参数传递给它们!
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
}