N2-Works
WEB企画・制作/システム開発 大阪拠点

EventクラスのtargetとcurrentTargetの違い

ActionScript3.0の場合、イベントは3つの段階を経て伝達されていきます。

いわゆるキャプチャ段階、ターゲット段階、バブリング段階です。

addEventListenerの3つ目の引数、useCaptureのtrue、falseはこのキャプチャ段階の伝達を使用するかどうかを設定できます。

いきなりこんな事を書いたのは、EventのtargetプロパティとcurrentTargetの違いでエラーが発生したからです。

DisplayObjectContainerを継承したObject、例を挙げればSpriteなどはaddChild関数で子オブジェクトを関連付けられます。

サンプル

package net.n2works.EventDispatcherSample 
{
  // SYSTEM PACKAGE
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  import fl.controls.TextArea;
  
  public class EventDispatcherSample extends Sprite 
  {
    // テキストボックス
    private var mTextarea:TextArea;
    
    public function EventDispatcherSample() 
    {
      // 子オブジェクトを作成
      var child:Sprite = new Sprite();
      child.name = "child";
      child.graphics.beginFill(0xff0000, 1);
      child.graphics.drawRect(0, 0, 100, 100);
      child.graphics.endFill();
      child.x = 0;
      child.y = 0;
      addChild(child);
      
      // 孫オブジェクトを作成
      var gc:Sprite = new Sprite();
      gc.name = "gc";
      gc.graphics.beginFill(0x0000ff, 1);
      gc.graphics.drawRect(0, 0, 50, 50);
      gc.graphics.endFill();
      gc.x = 25;
      gc.y = 25;
      child.addChild(gc);      
      
      // マウスクリック時のイベントリスナを設定
      stage.addEventListener(MouseEvent.CLICK, ListenerStageClick);
      root.addEventListener(MouseEvent.CLICK, ListenerRootClick);
      child.addEventListener(MouseEvent.CLICK, ListenerChildClick);
      
      // テキストエリア
      mTextarea = new TextArea();
      mTextarea.width = 200;
      mTextarea.height = 100;
      mTextarea.x = 100;
      mTextarea.y = 0;
      addChild(mTextarea);
    }
    
    private function ListenerStageClick(evt:MouseEvent):void
    {
      mTextarea.appendText("stage click");
      mTextarea.verticalScrollPosition = mTextarea.textHeight;
    }
    
    private function ListenerRootClick(evt:MouseEvent):void
    {
      mTextarea.appendText("root click");
    }
    
    private function ListenerChildClick(evt:MouseEvent):void
    {
      mTextarea.appendText("target name: "+evt.target.name+"");
      mTextarea.appendText("current target name: "+evt.currentTarget.name+"");
    }
  }
}

要FlashPlayer

子オブジェクトだけにイベントリスナを設定しているので孫オブジェクトをクリックした時は、伝達されて子オブジェクトがターゲットとなると思っていたのですが、結果は違いました。

孫オブジェクトがクリックされると、targetは孫オブジェクト、currentTargetは子オブジェクトとなっています。

結論としては、オブジェクトツリーにおいて直接クリックされたオブジェクトよりも親のオブジェクトは、ターゲット段階とバブリング段階を経てイベントが伝達されます。

その際、直接クリックされたオブジェクトがtargetプロパティに格納され、currentTargetにはイベントリスナが関連付けられたオブジェクトが格納されるということです。

イベントリスナを関連付けているオブジェクトをEvent継承クラスから取得するにはcurrentTargetを参照するべきだということになります。

[Flash]2011年08月18日 20時56分39秒

※1000文字以内で入力してください

captcha
TOP