[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のほうを参照する癖をつけておいたほうがいいのかもしれない。