イベントオブジェクト

Flash Player 9 以降、Adobe AIR 1.0 以降

イベントオブジェクトは、新しいイベント処理システムで 2 つの主な目的に使用されます。 1 つは、個々のイベントに関する情報を各種プロパティに格納して、具体的なイベントを表現することです。もう 1 つは、各種メソッドを使用してイベントオブジェクトを操作し、イベント処理システムの動作を変化させることです。

それらのプロパティとメソッドにアクセスしやすいよう、Flash Player API には、イベントオブジェクトすべての基本クラスとなる Event クラスが定義されています。 Event クラスは、すべてのイベントオブジェクトに共通する基本的なプロパティとメソッドを備えています。

このセクションでは、まず Event クラスのプロパティと、次に Event クラスのメソッドについて順に説明し、最後に、Event クラスにサブクラスが存在する理由について説明します。

Event クラスのプロパティについて

Event クラスには、イベントオブジェクトに関する重要な情報を提供する多数の読み取り専用プロパティと定数があります。次のプロパティは特に重要です。

  • Event オブジェクトのタイプは定数によって表され、 Event.type プロパティに格納されます。

  • イベントのデフォルト動作を回避できるかどうかはブール値で表され、 Event.cancelable プロパティに格納されます。

  • イベントフローに関する情報はその他のプロパティに格納されます。

イベントオブジェクトのタイプ

すべてのイベントオブジェクトには、それぞれイベントタイプが設定されます。イベントタイプはストリング値として Event.type プロパティに格納されます。イベントオブジェクトのタイプを知ることができると、コードを作成する際に、タイプに応じてオブジェクトの処理方法を区別できて便利です。例えば、次のコードでは、 myDisplayObject に渡されるマウスクリックのイベントオブジェクトすべてに対して clickHandler() リスナー関数が応答するように指定しています。

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

20 数種類のイベントが Event クラスそのものに関連付けられ、Event クラス定数によって表されます。その内のいくつかを Event クラス定義から抜粋して次に示します。

package flash.events 
{ 
    public class Event 
    { 
        // class constants 
        public static const ACTIVATE:String = "activate"; 
        public static const ADDED:String= "added"; 
        // remaining constants omitted for brevity 
    } 
}

これらの定数を使用すると、特定のイベントタイプを簡単に参照することができます。 各定数が表すストリングを直接に使用することは避け、定数名で参照するようにしてください。 コードに入力した定数名にスペルミスがあった場合はコンパイラーによって検出できます。しかし、ストリングの値にスペルミスがあった場合はコンパイル時のエラーとならず実行時に予期しない動作が生じ、困難なデバッグ作業が必要となる可能性があります。 例えば、イベントリスナーを登録する際は次のようなコードを使用してください。

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

次のコードはお勧めできません。

myDisplayObject.addEventListener("click", clickHandler);

デフォルト動作に関する情報

コードで cancelable プロパティを調べることにより、特定のイベントオブジェクトに対するデフォルト動作をキャンセルできるかどうかを知ることができます。 cancelable プロパティの値は Boolean 型で、デフォルト動作に対するキャンセルの可否を示します。デフォルト動作をキャンセルできるイベントは少数ですが、キャンセルできる場合は、関連付けられた動作を preventDefault() メソッドで無効化できます。詳しくは、 Event クラスのメソッドについて の「イベントのデフォルト動作のキャンセル」を参照してください。

イベントフロー情報

Event クラスの他のプロパティには、次に示すとおり、イベントオブジェクト自体やイベントフローとの関係に関する重要な情報が格納されます。

  • bubbles プロパティには、そのイベントオブジェクトの伝達経路となるイベントフローの構成要素に関する情報が含まれます。

  • eventPhase プロパティは、イベントフローが現在どの段階にあるかを示します。

  • target プロパティには、イベントターゲットへの参照が格納されます。

  • currentTarget プロパティには、当該イベントオブジェクトを現在処理している表示リストオブジェクトへの参照が格納されます。

bubbles プロパティ

イベントオブジェクトがバブリング段階にあるとき、そのオブジェクトによって表されるイベントは "浮上" 中、つまり、ターゲットノードからステージへと階層の上位に向かって戻る経路の途中にあります。 Event.bubbles プロパティには、そのイベントオブジェクトがバブリング段階を経由するかどうかを示すブール値が格納されます。バブリングの対象となるイベントは、必ずキャプチャ段階とターゲット段階の対象にもなるので、イベントフローの 3 段階すべてを経ることになります。 このプロパティの値が true の場合、当該イベントオブジェクトは 3 つの段階をすべて経由します。値が false の場合、イベントオブジェクトはバブリング段階の対象になりません。

eventPhase プロパティ

eventPhase プロパティを調べると、そのイベントオブジェクトがイベントのどの段階にあるかを知ることができます。 eventPhase プロパティには、イベントフローの 3 つの段階いずれかを示す符号なし整数値が格納されます。Flash Player API は、次のコードの抜粋に示すように、3 つの符号なし整数値に対応する 3 つの定数を含む別個の EventPhase クラスを定義します。

package flash.events 
{ 
    public final class EventPhase 
    { 
        public static const CAPTURING_PHASE:uint = 1; 
        public static const AT_TARGET:uint = 2; 
        public static const BUBBLING_PHASE:uint= 3; 
    } 
}

これらの定数は、 eventPhase プロパティの 3 つの有効な値に対応します。定数を使用すると、コードの読みやすさを向上できます。 例えば、イベントオブジェクトがターゲット段階にある場合にのみ myFunc() という関数を呼び出すようにするには、次のようなコードで条件を判断します。

if (event.eventPhase == EventPhase.AT_TARGET) 
{ 
    myFunc(); 
}

target プロパティ

target プロパティには、当該イベントのターゲットであるオブジェクトへの参照が格納されます。ターゲットの扱いは単純な場合とそうでない場合があります。例えば、マイクがアクティブになったことを示すイベントでは、イベントオブジェクトのターゲットは Microphone オブジェクトであることが明確です。 しかし、ターゲットが表示リスト内にある場合は、表示リストの階層構造を考慮する必要があります。 例えば、複数の表示リストオブジェクトの重なり合う地点がユーザーによってマウスでクリックされた場合、Flash Player および AIR では、ステージから最も遠い階層にあるオブジェクトがイベントターゲットとして選ばれます。

複雑な SWF ファイルでは、 target プロパティがうまく機能しないことがあります。各ボタンに対して子オブジェクトを使用した定型的な修飾処理が施されているような場合は、target プロパティの参照先がボタンではなく修飾用の子オブジェクトになってしまう状況が発生しやすいためです。このような状況では、ボタンにイベントリスナーを登録し、 currentTarget プロパティを使用するのが一般的です。そうすれば、 target プロパティが子オブジェクトを参照してしまう場合にも currentTarget プロパティでボタンを参照できます。

currentTarget プロパティ

currentTarget プロパティには、当該イベントオブジェクトを現在処理している表示リストオブジェクトへの参照が格納されます。調べる対象のイベントオブジェクトが現在どのノードで処理されているかが事前にわかっていないとは奇妙な状況のようにも聞こえますが、実際は特別なことではありません。なぜなら、当該イベントオブジェクトのイベントフローに含まれる任意の表示オブジェクトにリスナー関数が登録されている可能性があり、また、リスナー関数自体が任意の場所に配置されている可能性があるからです。 さらに、1 つのリスナー関数が複数の表示オブジェクトに登録されている場合もあります。 プロジェクトのサイズが拡大し、複雑さが増すと、 currentTarget プロパティがますます有用になります。

Event クラスのメソッドについて

Event クラスのメソッドは、次の 3 種類に大別されます。

  • ユーティリティメソッド : イベントオブジェクトのコピーを作成する、またはストリングに変換する

  • イベントフローメソッド : イベントオブジェクトをイベントフローから取り除く

  • デフォルト動作メソッド : デフォルト動作をキャンセルする、またはキャンセル済みかどうかを確認する

Event クラスのユーティリティメソッド

Event クラスには 2 つのユーティリティメソッドがあります。 clone() メソッドは、イベントオブジェクトのコピーを作成します。 toString() メソッドは、イベントオブジェクトの各種プロパティとそれらの値を表すストリング表現を生成します。これらのメソッドの両方がイベントモデルシステムで内部的に使用されますが、開発者の一般的な使用のために公開されています。

上級開発者が Event クラスのサブクラスを作成する場合は、イベントサブクラスを正常に機能させるために、両方のユーティリティメソッドをオーバーライドして独自のバージョンを実装する必要があります。

イベントフローの停止

イベントオブジェクトがイベントフローで処理されるのを停止するには、 Event.stopPropagation() メソッドまたは Event.stopImmediatePropagation() メソッドを呼び出します。これら 2 つのメソッドはほとんど同じですが、現在のノードの他のイベントリスナーを実行できるかどうかという点のみが異なります。

  • Event.stopPropagation() メソッドを呼び出すと、当該イベントオブジェクトがイベントフローで次のノードに伝達されるのを防ぐことができます。ただし、現在のノードに登録されている他のイベントリスナーはすべて実行されます。

  • Event.stopImmediatePropagation() メソッドを呼び出すと、当該イベントオブジェクトがイベントフローで次のノードに伝達されるのを防ぎ、また現在のノードに登録されている他のイベントリスナーの実行も防ぐことができます。

いずれのメソッドを呼び出した場合も、イベントに関連付けられているデフォルト動作が実行されるかどうかには影響しません。 デフォルト動作をキャンセルするには、Event クラスのデフォルト動作メソッドを使用する必要があります。

イベントのデフォルト動作のキャンセル

デフォルト動作のキャンセルに関連するメソッドには、 preventDefault() メソッドと isDefaultPrevented() メソッドの 2 つがあります。 preventDefault() メソッドを呼び出すと、イベントに関連付けられたデフォルト動作をキャンセルできます。 preventDefault() が既にイベントオブジェクトで呼び出されているかどうかをチェックするには、 isDefaultPrevented() メソッドを呼び出します。メソッドが既に呼び出されている場合は値 true が返され、そうでない場合は false が返されます。

preventDefault() メソッドは、デフォルト動作のキャンセルが可能であるイベントに対してのみ使用できます。キャンセルの可否については、API ドキュメントで該当するイベントタイプの項目を参照するか、ActionScript で当該イベントオブジェクトの cancelable プロパティを確認してください。

デフォルト動作をキャンセルしても、イベントフローによるイベントオブジェクト処理の進行には影響しません。イベントフローからイベントオブジェクトを削除するには、Event クラスのイベントフローメソッドを使用します。

Event クラスのサブクラス

多くのイベントは、Event クラスに定義されている共通のプロパティセットを使用すれば十分に表現できます。しかし、Event クラスのプロパティでは表現できない独特の性質を持ったイベントもあります。 これらのイベントでは、ActionScript 3.0 は Event クラスの複数のサブクラスを定義します。

各サブクラスには、そのイベントのカテゴリに特有のプロパティおよびイベントタイプが追加されています。例えば、マウスの入力に関するイベントには、Event クラスに定義されているプロパティでは表現できない独特の性質があります。 MouseEvent クラスは、Event クラスを拡張し、マウスイベントの発生位置や、発生時に特定のキーが押されていたかどうかなどの情報を格納するプロパティを追加したものです。

また、Event のサブクラスには、当該サブクラスに関連付けられたイベントタイプを表す定数が格納されます。 例えば MouseEvent クラスの場合、マウス関連のイベントタイプである click doubleClick mouseDown mouseUp を表す定数がそれぞれ定義されています。

イベントオブジェクト 下の Event クラスのユーティリティメソッドで説明したように、Event サブクラスを作成する場合は、 clone() toString() メソッドをオーバーライドして、サブクラスに固有の機能を提供する必要があります。