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
プロパティがますます有用になります。