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

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

サブトピック

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

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

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

いずれのメカニズムにも、それぞれに特有のメリットとデメリットがあります。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) Level 3 Events 仕様に基づいています。SWF ファイルの形式は DOM の標準仕様に準拠していませんが、表示リストと DOM の構造には、DOM イベントモデルを実装するために十分な程度の共通点があります。表示リスト上のオブジェクトは DOM 階層構造のノードに類似しており、"表示リストオブジェクト" と "ノード" という用語は、ここでの説明を通じて同じ意味で使用されます。

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

デフォルト動作

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

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

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

多くの種類のイベントオブジェクトには、デフォルト動作が関連付けられていません。たとえば、ネットワーク接続が確立すると Flash Player から connect イベントが送出されますが、このイベントに関連付けられたデフォルト動作はありません。Event クラスとそのサブクラスの API ドキュメントは、各タイプのイベントを示し、関連するデフォルト動作とその動作を回避できるかどうかについて説明します。

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

ActionScript 3.0 のイベントリスナーに関する新機能

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


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000136.html