feb19.jp blog - life is creative!

AS3のInteractiveObject.mouseEnabledにご注意

ブックマークに追加する tags:   

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

2008年04月01日02:03

Webデザインブログ

「AS3のInteractiveObject.mouseEnabledにご注意」の関連エントリー

 iTunes Store(Japan)

コメント (1)

kuma:

すでに1年前の記事ですが
このMOUSE_OUTんとこどうなんでしょ?何か新しい情報ありましたか?

最近 ようやくAS3などがいい感じに理解できるようになって 貴殿のブログなど超参考にさしてもらってます わかりやすい解説サンクス

コメントを投稿

トラックバック

このエントリーのトラックバックURL:
http://feb19.jp/mt/mt-tb.cgi/142

Navigation

古:AS3でXMLを読み込む
新:AS3のEvent.REMOVEDがなかなか便利なので使用方法と注意点
トップページ

Recently Entries
Flash 上でパブリッシュしたとき、型宣言されていない変数・関数があったら警告を出す
Flex SDK (mxmlc)や Flex Builder とかで...
Flash Builder 4 Standard 導入
色々メモリリークチェックとか出来る Premium は必要になってか...
Mac でファイルの関連付けを変える(Mac で AIR アプリがアップデート出来ないを解決する方法)
ファイルを右クリックして「情報を見る」を選び、表示されたウィンドウの...
Mac OS X 10.6 Snow Leopard から入ってるフォント「Menlo」がコーディング作業にいい感じ
Xcode でコード書いているとき、Eclipse でコード書くより...
AIR で JSON 形式ファイルの入出力
AIR 祭り開催中。今回はファイル入出力。AS3 で扱っている Ob...
Adobe CS5 ティザーサイトオープン
カウントダウンが始まっています。いよいよ CS5 ですね。globa...
AIR でファイルがドラッグアンドドロップされたことを NativeDragEvent で検知する
最近また AIR が楽しい気がして触っているのですが、 Google...
iPhone アプリ "iBeat - BPM Counter" を発売しました & iPhone インタラクションデザインについて
BPM 計測アプリです。既に似たようなアプリはいくつか発売されている...
AS3 の演算子 ||= について
AS3 だけでつかえるものではないのですが、AS3 での動作を確認し...
iPhone SDK 「カテゴリ」について+NSString の空白文字を除去する
Objective-C では、高位のフレームワークで、低位のフレーム...