feb19.jp

Nobuhiro Takahashi
Designer / Engineer

AS3のInteractiveObject.mouseEnabledにご注意

AS3のInteractiveObject.mouseEnabledにご注意む

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しろってことなのですかね。うーんめんどくさい。

Tweet Share Bookmark

Navigation

prev: AS3でXMLを読み込む
next: AS3のEvent.REMOVEDがなかなか便利なので使用方法と注意点

Recently Entries