[ActionScript 3.0] Event#targetとcurrentTarget

イベントをリスナーで受け取ったとき、Event#targetとEvent#currentTargetの指し示すものが異なる場合がある。特にMouseEventでは注意が必要。

			var child:Sprite = new Sprite;
			child.graphics.beginFill(0);
			child.graphics.drawRect(20, 20, 20, 20);
			
			var parent:Sprite = new Sprite;
			parent.graphics.beginFill(0x0000ff, 0.5);
			parent.graphics.drawRect(20, 20, 50, 50);
			
			parent.addChild(child);
			
			parent.addEventListener(MouseEvent.CLICK,
				function (e:MouseEvent):void {
					if (e.target == parent) trace("e.target is parent");
					else trace("e.target is child");
					
					if (e.currentTarget == parent) trace("e.currentTarget is parent");
					else trace("e.currentTarget is parent");
				}
			);
			
			addChild(parent);

Event#targetとcurrentTarget – wonderfl build flash online

この例だと、parentにリスナーをつけているにもかかわらず、childの部分をクリックすると、currentTargetはparentだがtargetはchildになる。

つまり、targetはイベントが発生するきっかけとなったオブジェクトを指し示し、currentTargetはあくまでリスナーをつけたオブジェクトになる。

普通、childからのイベントを受け取りたければそれ自身にaddEventListnerするはずなので、Event#targetによって対象を判別することはあまりないように思う。

よって、つまらないミスを防ぐために、基本的にEvent#currentTargetのほうを参照する癖をつけておいたほうがいいのかもしれない。