イベントフロー

Flash Player または AIR では、イベントが発生するたびにイベントオブジェクトが送出されます。イベントターゲットが表示リスト内にない場合、Flash Player または AIR からイベントターゲットに対して直接にイベントオブジェクトが送出されます。例えば、progress イベントオブジェクトは URLStream オブジェクトに対して直接に送出されます。 イベントターゲットが表示リスト内にある場合、イベントオブジェクトは表示リストに対して送出され、表示リストの階層内を経由してイベントターゲットに到達します。

イベントフローは、表示リスト内をイベントオブジェクトが伝わる経路です。表示リストの構造はツリー状の階層になっており、 そのトップの階層はステージです。ステージは特殊な表示オブジェクトコンテナであり、表示リストのルートとして機能します。 ステージは flash.display.Stage クラスによって表され、表示オブジェクトを介してのみアクセスできます。 すべての表示オブジェクトには、そのアプリケーションのステージを参照する stage という名前のプロパティが設定されています。

Flash Player または AIR によって表示リスト関連イベントのイベントオブジェクトが送出されると、そのイベントオブジェクトはステージからターゲットノードまでを往復します。DOM Events 仕様では、ターゲットノードとはイベントターゲットを表すノードのことであると定義されています。これを言い換えれば、ターゲットノードとは当該イベントが発生した表示リストオブジェクトのことです。 例えば、ユーザーが child1 という名前の表示リストオブジェクトをクリックすると、Flash Player または AIR は child1 をターゲットノードとして使用するイベントオブジェクトを送出します。

概念上、イベントフローは 3 つの部分に分けられます。 第 1 の部分はキャプチャ段階と呼ばれ、ステージからターゲットノードの親までのノードすべてがこれに含まれます。 第 2 の部分はターゲット段階と呼ばれ、ターゲットノードだけがこれに含まれます。 第 3 の部分はバブリング段階と呼ばれ、 バブリング段階は、ターゲットノードの親からステージに戻る帰り道で検出されるノードで構成されます。

次の図のように、ステージを最上位とする縦の階層として表示リストの構造を考えると、各段階に付けられた名前の意味がよりよくわかります。


ユーザーによって Child1 Node がクリックされると、Flash Player または AIR により、イベントオブジェクトがイベントフローに対して送出されます。次の図で示すように、オブジェクトは Stage から始まる伝達経路を下っていき、Parent Node を経て Child1 Node に到達してから、もう一度「バブリング」によって Parent Node から Stage へと逆方向の経路を浮上していきます。


この例で、イベントオブジェクトが下に向かって伝達されていくキャプチャ段階には、Stage および Parent Node が含まれています。ターゲット段階には Child1 Node が含まれています。バブリング段階は、ルートノードに戻る上方向への移動中に検出される Parent NodeStage で構成されます。

このイベントフローは、従来よりいっそう強力な ActionScript 用イベント処理システムの実現に寄与しています。 ActionScript の以前のバージョンでは、イベントフローの仕組みが存在しなかったため、イベントの生成元となるオブジェクトにイベントリスナーを登録することしかできませんでした。 ActionScript 3.0 では、ターゲットノード自体の他、イベントフローに含まれる任意のノードにイベントリスナーを登録できます。

イベントリスナーをイベントフローに追加する機能は、ユーザーインターフェイスコンポーネントが複数のオブジェクトで構成されている場合に役立ちます。 例えばボタンオブジェクトは、ボタンのラベルとして機能するテキストオブジェクトを含むことがよくあります。リスナーをイベントフローに追加する機能がないと、ボタンの任意の場所で発生したクリックイベントに関する通知を受信できるように、ボタンオブジェクトとテキストオブジェクトの両方にリスナーを追加する必要が生じます。 しかし、イベントフローがあることで、単一のイベントリスナーをボタンオブジェクトに配置し、テキストオブジェクトと、テキストオブジェクトで隠されていないボタンオブジェクトの領域の両方で発生したクリックイベントを処理できます。

ただし、イベントオブジェクトのタイプによっては、イベントフローの 3 段階のうち一部しか処理されないことがあります。 例えば、enterFrameinit などのタイプはターゲットノードに対して直接に送出され、キャプチャ段階とバブリング段階を経ることがありません。また、その他のイベントでは表示リストにないオブジェクトがターゲットになることがあります。Socket クラスのインスタンスに対して送出されるイベントなどがこれに該当します。 これらのイベントオブジェクトは、キャプチャ段階またはバブリング段階を経ずに、ターゲットオブジェクトにも直接フローします。

具体的な各種イベントタイプの動作については、API ドキュメントを参照するか、実際のイベントオブジェクトのプロパティを確認してください。 イベントオブジェクトのプロパティについては、次の節で説明します。