as3でイベントを起動するには、通常
this.dispatchEvent(new Event(Event.COMPLETE));
のようにイベントタイプをクラス定数で渡すという お行儀の良い方法をとる。
でもas2のようにおきらくにカスタムイベントを使いたい。 で、
this.addEventListener('hoge', this.onHoge);
として
this.dispatchEvent(new Event('hoge'));
と任意の文字列でイベントタイプを渡すこともできるが イベントタイプの識別は文字列であって どのイベントクラスの定数かまでは考慮されないので
this.addEventListener('complete', this.onComplete);
とカスタムイベントをセットしているつもりでも
イベントタイプがthis
の組み込みのものと一致すると
予期しないタイミングで組み込みイベントEvent.COMPLETEが発生してしまい
危険。
とにかく 安全にカスタムイベントをセットするには 組み込みイベントタイプと一致しない文字列を指定しなければならない。
そこで
public class E extends Event {
private static const PREFIX:String = 'easy_event_prefix_';
public function E(type:String,
bubbles:Boolean=false,
cancelable:Boolean=false) {
super(E.t(type), bubbles, cancelable);
}
public override function clone():Event {
return new E(type, bubbles, cancelable);
}
public static function t(type:String):String {
return E.PREFIX + type;
}
}
のようにEventクラスを継承したEクラスなどを1つつくっておき
イベントの登録には
this.addEventListener(E.t('complete'), this.onComplete);
イベントの起動には
this.dispatchEvent(new E('complete'));
としておけば
easy_event_prefix_
という接頭辞がついたイベントタイプで
受け渡しが行われるので
組み込みイベントに反応することはない。
コメント(0):
コメントを投稿