0

我有一个根组件 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 中,但它不起作用!

4

1 回答 1

2

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

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

1.swap添加处理程序

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

2.使用事件优先级

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

此外,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
}
于 2013-06-13T10:35:37.487 回答