[ActionScript 3.0] Event#targetとcurrentTarget

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

[as3]
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);
[/as3]

Event#targetとcurrentTarget – wonderfl build flash online

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

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

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

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