MouseEventに対するtargetとcurrentTargetについて

東京ひよこの会でボタンについての勉強会での復習用自分メモ。

MovieClipのbtnにrectっていうMovieClipのヒットエリアを入れ子で持たせている場合、
mouseHandlerを以下のようにまとめていたのですが、
(btn内のヒットエリア用rectっていうMovieClipはロールオーバ時のエフェクトも兼ねてるので白のalpha=0で置いてます)

btn.addEventListener(MouseEvent.ROLL_OVER, mouseHandler );
btn.addEventListener(MouseEvent.ROLL_OUT, mouseHandler );
btn.addEventListener(MouseEvent.CLICK, mouseHandler );

private function mouseHandler(e:MouseEvent):void
{
	switch(e.type){
		case "rollOver":
			e.target.rect.alpha = 0.3;
			txt.text = e.target.name;
			break;

		case "rollOut":
			e.target.rect.alpha = 0;
			break;

		case "click":
			switch(e.target.parent.name){	// クリックされる対象がrectの為、parentのインスタンス名を取る
				case "btn0":
					txt.text = "this is "+e.target.parent.name;
					break;

				case "btn1":
					txt.text = "this is "+e.target.parent.name;
					break;

				case "btn2":
					txt.text = "this is "+e.target.parent.name;
					break;
			}
			break;
	}
}

イベントタイプがclickの時だけクリックされる対象がbtnではなく、
btn内のrectっていうヒットエリア用のMovieClipなのでe.target.parentみたいな書き方になっています。
というようなことをさらっと説明すると、そこわざわざそうしなくてもe.currentTargetで取れるよ。とのご指摘が。

currentTarget??

聞いたことあったのですがe.target.parentとどう違うの??
意味的に同じっぽくね??っていう最高にひよこレベルに相応な自分だったので自分の為にも早速調べてみますた。

実際にはイベントリスナーを追加したインスタンスを指すということだったんですね!(恥

今回だと、rollOver,rollOut,clickの処理に対して全て親元のボタンのインスタンス名を
取得したかったので、ということはこんな出し分け的に書かずとも全てcurrentTargetで取得できますね。
ということでmouseHandler内のe.targetやe.target.parentは以下のように全部
e.currentTargetで統一することができました。

private function mouseHandler(e:MouseEvent):void
{
	switch(e.type){
		case "rollOver":
			e.currentTarget.rect.alpha = 0.3;
			txt.text = e.currentTarget.name;
			break;

		case "rollOut":
			e.currentTarget.rect.alpha = 0;
			break;

		case "click":
			switch(e.currentTarget.name){
				case "btn0":
					txt.text = "this is "+e.currentTarget.name;
					break;

				case "btn1":
					txt.text = "this is "+e.currentTarget.name;
					break;

				case "btn2":
					txt.text = "this is "+e.currentTarget.name;
					break;
			}
			break;
	}
}

target,target.parent,currentTargetの違いが自分の中でちゃんと理解できました!
東京ひよこのみなさまに感謝感謝です。m(_ _)m

ちなみにそもそもの話なんですが、やっぱり他人に分かりやすい様に書きたいのであれば、
MouseEventごとに関数別途用意すれば?という本当にごもっともな意見も頂けましたので、
次回からは横着せずに分けて記述しようと思います!(恥

oshige.comさんを見れば一発で理解できました。
どうもありがとうございます。m(_ _)m
入れ子のムービークリップのマウスイベント currentTarget – ActionScript 3.0入門ノート CS4
イベントフロー(targetとcurrentTarget) (ActionScript3.0入門ノート)

you

コメントは受け付けていません。