
AS2ではMovieClip.enabled = false;なんてやって、そのムービークリップをマウスに反応させないようにしていたわけですが、AS3ではInteractiveObject.mouseEnabledでやりますよ、と先日の記事で解説したのですが、実は落とし穴が。
それは、InteractiveObject.mouseEnabled = false;をすると、そのインタラクティブオブジェクトに対して、mouseOutのイベントが送信されてしまうということです。
btn.buttonMode = true;
btn.addEventListener(MouseEvent.MOUSE_OUT, onMouseOutHandler);
btn.addEventListener(MouseEvent.CLICK, onClickHandler);
function onMouseOutHandler(e:MouseEvent):void {
trace(e.target.name); //btn
trace(e.currentTarget.name); //btn
trace(e.eventPhase); //2
trace(e.type); //mouseOut
}
function onClickHandler(e:MouseEvent):void {
e.currentTarget.mouseEnabled = false;
}
こんなコードを書いて、btnをクリックしたとき、e.currentTargetつまりbtnを、mouseEnabled = falseにした時、onMouseOutHandlerの内容が実行されてしまいます。
targetプロパティやeventPhase、typeとかで上手く判別できないかなとか思っていたのですが、どうも出来ないみたい。普通にマウスアウトしたときと同じ内容の物がトレースされるので。
これは微妙な仕様ですねー。っていうかAS3のバグでは無いですよね?
というわけで、mouseOutに反応させたくない場合は、こんな感じにします。
btn.buttonMode = true;
btn.addEventListener(MouseEvent.MOUSE_OUT, onMouseOutHandler);
btn.addEventListener(MouseEvent.CLICK, onClickHandler);
function onMouseOutHandler(e:MouseEvent):void {
trace(e.target.name); //btn
trace(e.currentTarget.name); //btn
trace(e.eventPhase); //2
trace(e.type); //mouseOut
}
function onClickHandler(e:MouseEvent):void {
e.currentTarget.buttonMode = false;
e.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, onMouseOutHandler);
e.currentTarget.removeEventListener(MouseEvent.CLICK, onClickHandler);
}
ズルせず、ちゃんとremoveEventListenerしろってことなのですかね。うーんめんどくさい。


コメント (1)
すでに1年前の記事ですが
このMOUSE_OUTんとこどうなんでしょ?何か新しい情報ありましたか?
最近 ようやくAS3などがいい感じに理解できるようになって 貴殿のブログなど超参考にさしてもらってます わかりやすい解説サンクス
投稿者: kuma | 2009年06月18日 22:05