ActionScript 3.0 イベント処理の以前のバージョンとの違い

Flash Player 9 以降、Adobe AIR 1.0 以降

ActionScript 3.0 のイベント処理と、ActionScript の以前のバージョンにおけるイベント処理との最も目立つ違いは、ActionScript 3.0 にはイベント処理に関するシステムが 1 つしかないのに対し、以前のバージョンには複数の異なるイベント処理システムが存在していたことです。 このセクションでは、まず、以前のバージョンにおけるイベント処理の仕組みを概観し、続いて、それが ActionScript 3.0 でどのように変更されたかを説明します。

ActionScript の以前のバージョンにおけるイベント処理

ActionScript 3.0 より前のバージョンでは、イベント処理に関して次のように複数の方法が存在していました。

  • Button インスタンスや MovieClip インスタンスに直接配置できる on() イベントハンドラー

  • MovieClip インスタンスに直接配置できる onClipEvent() イベントハンドラー

  • XML.onload Camera.onActivity などのコールバック関数プロパティ

  • addListener() メソッドを使用して登録するイベントリスナー

  • DOM イベントモデルの一部を実装した UIEventDispatcher クラス

いずれのメカニズムにも、それぞれに特有のメリットとデメリットがあります。 on() ハンドラーと onClipEvent() ハンドラーの場合は、気軽に使用できる反面、ボタンやムービークリップにコードを直接配置すると見通しが悪いため以後のプロジェクト保守作業が困難になります。コールバック関数の場合も、実装作業は簡単ですが、1 種類のイベントについてコールバック関数を 1 つしか作成できないという制約があります。 イベントリスナーの実装が困難になり、リスナーオブジェクトや関数の作成だけではなく、イベントを生成するオブジェクトを備えたリスナーの登録が必要です。ただし、このオーバーヘッドの増加により、複数のリスナーオブジェクトを作成し、それらのすべてを同じイベントに登録することが可能になります。

ActionScript 2.0 用コンポーネントが開発される際にもう 1 つのイベントモデルが導入され、 この新しいモデルは、UIEventDispatcher クラスで実装され、DOM Events 仕様のサブセットに基づいています。 コンポーネントのイベント処理に詳しい開発者にとって、新しい ActionScript 3.0 イベントモデルへの移行は比較的容易です。

従来の各種イベントモデルの間には、使用するシンタックスが様々な形で重複していたり、また別の面では違っていたりするという問題がありました。 例えば、ActionScript 2.0 における一部のプロパティ( TextField.onChanged など)は、コールバック関数として使用することも、イベントリスナーとして使用することもできました。ところが、リスナーをサポートする 6 つのクラスと UIEventDispatcher クラスとではリスナーオブジェクトを登録する際のシンタックスが違っていました。 つまり、Key、Mouse、MovieClipLoader、Selection、Stage、TextField の各クラスでは addListener() メソッドを使用する一方、コンポーネントのイベント処理については addEventListener() メソッドを呼び出す必要がありました。

他にも、イベント処理モデルが複数あることに起因して、イベントハンドラー関数のスコープが使用メカニズムによって異なるという問題がありました。 このため、 this キーワードの指す対象が一貫せず、使用するイベント処理システムによって異なっていました。

ActionScript 3.0 におけるイベント処理

ActionScript 3.0 ではイベント処理モデルが一本化され、以前のバージョンに存在していた複数のイベント処理メカニズムはそれによって置き換えられました。 新しいイベントモデルは、ドキュメントオブジェクトモデル(DOM)レベル 3 のイベント仕様に基づいています。 SWF ファイルの形式は DOM の標準仕様に準拠していませんが、表示リストと DOM の構造には、DOM イベントモデルを実装するために十分な程度の共通点があります。 表示リスト上のオブジェクトは DOM 階層構造のノードに類似しており、表示リストオブジェクトとノードという用語は、ここでの説明を通じて同じ意味で使用されます。

Flash Player および AIR における DOM イベントモデルの実装には、デフォルト動作という概念が導入されています。デフォルト動作とは、特定のイベントの通常の結果として Flash Player または AIR が実行するアクションです。

デフォルト動作

イベントに応答するコードは、通常は開発者が記述します。しかし、イベントに対して何らかの決まった動作が非常によく行われる場合については、一般的な処理が Flash Player または AIR によって自動的に実行されるようになっています(開発者が特にこの動作をキャンセルするためのコードを記述した場合を除く)。Flash Player または AIR が動作を自動的に表示するので、このような動作をデフォルト動作と呼びます。

例えば、ユーザーによって TextField オブジェクトにテキストが入力されたとき、たいていの場合は、入力されたテキストをその TextField オブジェクトに表示する必要があります。これは非常に一般的な動作なので、Flash Player および AIR に組み込まれています。この動作が不要な場合は、新しいイベント処理システムを使用してデフォルト動作をキャンセルできます。 ユーザーによって TextField オブジェクトにテキストが入力されると、その入力を表す TextEvent クラスのインスタンスが Flash Player または AIR によって作成されます。入力テキストが Flash Player または AIR によって TextField オブジェクト内に表示されるのを防ぐには、その特定の TextEvent インスタンスにアクセスして preventDefault() メソッドを呼び出す必要があります。

デフォルト動作の中には、キャンセルできないものもあります。例えば、ユーザーによって TextField オブジェクト内の単語がダブルクリックされると、Flash Player および AIR から MouseEvent オブジェクトが生成されます。回避できないデフォルト動作は、カーソル位置にある単語がハイライト表示される動作です。

多くの種類のイベントオブジェクトには、デフォルト動作が関連付けられていません。例えば、ネットワーク接続が確立すると Flash Player から connect イベントが送出されますが、このイベントに関連付けられたデフォルト動作はありません。 API ドキュメントの Event クラスとそのサブクラスに関する項目には、各種イベントの一覧と、関連付けられたデフォルト動作がある場合はその内容、およびデフォルト動作をキャンセルできるかどうかが説明されています。

デフォルト動作は Flash Player または AIR から送出されるイベントオブジェクトにしか関連付けられないため、ActionScript のプログラムで送出したイベントオブジェクトに対しては実行されません。この点を理解しておくことは重要です。例えば、EventDispatcher クラスのメソッドを使用して textInput タイプのイベントオブジェクトを送出することはできますが、その場合はイベントオブジェクトにデフォルト動作が関連付けられません。したがって、プログラムから textInput イベントを送出しても、その結果 Flash Player および AIR によって TextField オブジェクトに文字が表示されることはありません。

ActionScript 3.0 のイベントリスナーの新機能

ActionScript 2.0 の addListener() メソッドを使用した経験があれば、ActionScript 2.0 のイベントリスナーモデルと ActionScript 3.0 のイベントモデルとの違いがよくわかります。次のリストでは、2 つのイベントモデル間のいくつかの主な違いについて説明します。

  • ActionScript 2.0 でイベントリスナーを追加するには、ある場合には addListener() を使用し、他の場合には addEventListener() を使用します。一方、ActionScript 3.0 では、すべての場合に addEventListener() を使用します。

  • ActionScript 2.0 にはイベントフローの仕組みがないため、 addListener() メソッドを呼び出せるのは当該イベントをブロードキャストするオブジェクトに対してのみでした。ActionScript 3.0 では、イベントフローの一部となっているすべてのオブジェクトに対して addEventListener() メソッドを呼び出せます。

  • ActionScript 2.0 では、イベントリスナーは関数、メソッド、オブジェクトのいずれかですが、ActionScript 3.0 では、関数とメソッドだけをイベントリスナーにできます。