0

私はルートコンポーネント A と2つのコンポーネント 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 に答える