DisplayObjectContainer の記事のときに、ディスプレイリストと呼ばれる DisplayObject のツリー構造について触れました。AS3 のイベントモデルはディスプレイリストと密接にかかわっています。
上の図は、ディスプレイリストの一例を図として表したものです。新しいイベントモデルでは、イベントがターゲットのオブジェクトに直接ディスパッチされるのではなく、上記のような階層構造のルートからターゲットまで途中のノードを順番に経由してイベントが伝わり、そしてまたルートへと途中のノードを経由しながらイベントが戻ります。この一連の流れをイベントフローと呼びます。
イベントフローは3つのフェーズに分けて考えます。例えば Child1 がクリックされたときのイベントフローは下図になります。
最初のフェーズはルートから Child1 にイベントが伝わるフェーズでキャプチャフェーズと呼ばれます。キャプチャフェーズは図の赤で示されている範囲で Child1 の直前のノードまでです。Child1 にイベントが伝わったら、その状態がターゲットフェーズと呼ばれる2つ目のフェーズです。図中では緑で表示されています。最後の3つ目がバブリングフェーズで、Child1 直後のノード (Parent) からルートまでを指します。青で示された範囲です。
前の記事にも書いたように DisplayObject は EventDispatcher のサブクラスなので、各ノードにはイベントリスナーを登録できます。そのため、他のオブジェクトに対するイベントであってもイベントフローの中に含まれるオブジェクトであればイベント処理を呼び出すことが可能です。例えば、上図で Child1 がクリックされたときの処理を Parent ノードにも登録できるわけです。イベントを使った親子の連携処理がいろいろな場面で使えそうですね。
従来のイベントモデルはターゲットフェーズのみだったと考えることができます。AS3 でも全てのイベントが3つのフェーズを持つわけであはありません。例えば、enterFrame イベントはターゲットのオブジェクトに直接ディスパッチされバブリングは起きません。個々ののイベントが持つフェーズついては該当するドキュメントを参照してください。
コメントする