dispatchEventが起動しないのはなぜですか?

大丈夫そう私の主なプロジェクトで私の問題はdispatchEventを使用してイベントを発生しようとしている私はこれをテストするために簡単なテストクラスを作った、まだまだ動作していない...

ここにテストクラスがあります

package 
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite 
{
    public function Main() {

        stage.addEventListener("pOver", rake);


        dispatchEvent(new Event("pOver"));
    }


    public function rake(e:Event):void {

        trace("working");
    }

}

なぜそれは発射しないのですか?リスナーがそのイベントをキャプチャしていないのはなぜですか?

0

2 答え

Stage の子である Main にイベントをディスパッチしています。 Stage にイベントを送出する場合は、次のようにします。

stage.dispatchEvent(new Event("pOver"));

今、あなたが「子供の場合は、私のイベントハンドラがまだ起動しているはずです」と疑問に思うかもしれません。

はい、いいえ。

イベントライフサイクルの簡単な図を見てみましょう:

enter image description here

まず、ディスパッチしているイベントは、イベントのバブリングではありません。 イベントを調べる コンストラクタの場合、そのシグネチャは次のようになります。

public function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)

2番目の引数はデフォルトで false です。つまり、このイベントはイベントライフサイクルのバブリング部分を実行しません。

次に、イベントのライフサイクルのバブル側にイベントディスパッチャを接続しました。 .addEventListener() のようになります。

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

3番目の引数に注目してください。これはデフォルトで false です。これは、イベントの「バブリング」側に取り付けることを意味します。

これは、このイベントが対象の要素、つまり Main のインスタンスに到達してから停止し、他の場所には移動していないことを意味します。

TL;DR: So what does that all mean?

したがって、イベントハンドラをトリガするには、イベントが送出される場所を変更しない場合は、トリガするイベントを変更する必要があります。

this.dispatchEvent(new Event("pOver", true)); //this event will bubble

イベントハンドラは子イベントであるため、このイベントによってトリガされます。

逆に、バブルではないイベントもイベントライフサイクルのキャプチャ側で進歩すると思いますので、イベントリスナーを変更してイベントのその側にも付けることができます。

stage.addEventListener("pOver", rake, true);//attach to a capturing side

そのイベントはバブリングしていないとマークされていても、キャプチャフェーズを介して常にそのイベントが流れると私は考える 。しかし、私はそれを間違える可能性があります 。 「非バブリング」イベントがキャプチャフェーズとバブリングフェーズの両方をスキップし、ターゲットイベントフェーズをトリガするだけで、今すぐ確認する時間がないことを覚えていません。


編集

だから、 wonderflのクイックテストを書きました:

package {
    import flash.events.Event;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {

        private var debug:TextField;

        public function FlashTest() {
            stage.addEventListener("Foo", bubbleFooHandler);
            stage.addEventListener("Foo", captureFooHandler, true);

            trace("Ready");

            trace("---------------");
            trace("Trying a non-bubbling event");
            this.dispatchEvent(new Event("Foo"));

            trace("---------------");
            trace("Trying a bubbling event");
            this.dispatchEvent(new Event("Foo", true));
        }

        private function captureFooHandler(e:Event):void {
            trace("Triggered \"Foo\" from capturing phase\n");
        }

        private function bubbleFooHandler(e:Event):void {
            trace("Triggered \"Foo\" from bubbling phase");
        }
    }
}

これからの出力は

Ready
---------------
Trying a non-bubbling event
Triggered "Foo" from capturing phase
---------------
Trying a bubbling event
Triggered "Foo" from capturing phase
Triggered "Foo" from bubbling phase

イベントはキャプチャフェーズで常に進行することに注意してください。ただし、「バブリングイベント」としてマークされていない場合は、前を参照して、イベントのターゲットに到着したときに停止するツリー(イベントが送出された EventDispatcher )に降下します。

一方、バブルイベントは、ツリーを回ってします。

うまくいけば、これは物事をクリアする。

7
追加された
@MattWilliamsでは持っているがありませんが、そうでない場合は、イベントのバブリングの仕組みを理解する必要があります。
追加された 著者 James Holmes,
@catholiconネイティブイベントとカスタムイベントのイベントライフサイクルは同じです。私はいくつかの説明で答えを更新しました。
追加された 著者 James Holmes,
@ 32bitkidキャプチャフェーズは、キーボード、マウスイベントなどのユーザインタラクションイベントに関連すると思います。私はカスタムイベントがキャプチャフェーズを通過するとは思わない。
追加された 著者 catholicon,
@ 32bitkidうーん....それは面白いです。私は、実際にカスタムツリーを表示していないオブジェクトの観点からカスタムイベントを考えていました。しかし、あなたの例は確かに意味があります。ありがとう:)
追加された 著者 catholicon,
ああ、私はそれを聞いている同じオブジェクトでイベントをディスパッチする必要がありますか?
追加された 著者 Matt Williams,
ありがとう、相棒!非常に迅速な返信!あなたはすごいね!
追加された 著者 Matt Williams,

まず、あなたはステージイベントを聞いています。これは、ステージが Events をディスパッチしていない限り、コールバックを取得しないことを意味します。

お試しください

stage.dispatchEvent(new Event("pOver"));
1
追加された