0

今日、コーディング中に奇妙なことを発見しました。今日私に起こったことの説明を見つけることができませんでした。

ボタンを作成し、それに EventListener を追加しました。

private function drawButtons():void{
        survivorModeBtn = new SurvivorModeBtn();    
        trace("I registered Event Listener with button here");
        survivorModeBtn.addEventListener(MouseEvent.CLICK,onSurvivorModeBtnClick);
        addChild(survivorModeBtn);
}

private function onSurvivorModeBtnClick(e:MouseEvent):void{
        trace("I clicked on btn here");
        //I will dispatch event here which runs second part of code
        mainMenuViewEvent = new MainMenuViewEvent("onSurvivorModeIsClicked");
        hideButtons();
        dispatchEvent(mainMenuViewEvent);
}

ディスパッチされたイベントは、コードの次の部分を実行します。

public function createClickToStart():void{
        trace("here I register event listener MouseEvent.Click");
        stage.addEventListener(MouseEvent.CLICK,onClick);
    }

private function onClick(e:MouseEvent):void{
        trace("onClick()");
    }

プログラムを実行して最初のボタンをクリックすると。コンソールに次の出力が表示されました。

ここでボタンを使用してイベント リスナーを登録しました ここで btn をクリックしました イベント リスナーを登録します MouseEvent.Click onClick()

最初のボタンだけをクリックした場合、「onClick()」メッセージがどのように表示されるのか理解できず、その時点でも CLICK イベントでステージが再処理されませんでした。

私の問題を解決していただきありがとうございます。

4

1 に答える 1

1

イベントの「バブリング」と呼ばれるものを経験しました。最初に、「クリック」イベントがカーソルの下にある最上位のオブジェクトにディスパッチされます。次に、強制しない限り、親参照を介してステージまでずっと上に上げられますe.stopPropagation()。そのため、イベントが 内で解析されている間、survivorModeBtnまだステージに達していません。その間に、このタイプのイベントのステージ リスナーを割り当てます。その後、バブルが発生してステージに到達し、ステージは「うわー、MouseEvent.CLICK リスナーが登録されているので、今すぐ呼び出しましょう!」と言います。関数を呼び出しonClick()て、最後のトレース結果を受け取ります。

于 2012-11-07T12:36:08.420 に答える