MouseEventのtargetでつまづいた。

2008 年 10月 13 日

仕事中にごくごく簡単なところでつまづいたのでメモ。
グラフィック要素だけのMovieclipインスタンス「a_mc」と、「b_child_mc」というMovieClipを内包した「b_mc」というMovieClipインスタンス。「a_mc」と「b_mc」にMouseEventをaddEventListerして、イベントハンドラ内で「e.target」を参照すると、前者は「a_mc」を、後者は「b_child_mc」を返してくる。無知のため、後者が予想外だった。以下サンプル。

Actionscript:
  1. package  {
  2.     import flash.display.Sprite;
  3.     import flash.display.MovieClip;
  4.     import flash.events.MouseEvent;
  5.    
  6.     public class SampleMouseEvent extends Sprite {
  7.        
  8.         /**
  9.          * コンストラクタ
  10.          */
  11.         public function SampleMouseEvent():void{
  12.            
  13.             //グラフィック要素だけの「a_mc」をつくってstageに置く。
  14.             var a_mc:MovieClip = new MovieClip();
  15.             a_mc.name = "a_mc";
  16.             a_mc.graphics.beginFill(0xff9900);
  17.             a_mc.graphics.drawRect(0, 0, 100, 100);
  18.             a_mc.graphics.endFill();
  19.             stage.addChild(a_mc);
  20.             a_mc.x = 10;
  21.             a_mc.y = 10;
  22.            
  23.             //「b_mc」の子供となる「b_child_mc」を作る。
  24.             var b_child_mc:MovieClip = new MovieClip();
  25.             b_child_mc.name = "b_child_mc";
  26.             b_child_mc.graphics.beginFill(0x000099);
  27.             b_child_mc.graphics.drawRect(0, 0, 100, 100);
  28.             b_child_mc.graphics.endFill();
  29.            
  30.             //「b_mc」を作って、「b_child_mc」をaddChildして、stageに置く。
  31.             var b_mc:MovieClip = new MovieClip();
  32.             b_mc.name = "b_mc";
  33.             b_mc.addChild(b_child_mc);
  34.             stage.addChild(b_mc);
  35.             b_mc.x = 120;
  36.             b_mc.y = 10;
  37.            
  38.             //「a_mc」と「b_mc」にマウスオーバーのaddEventListener
  39.             a_mc.addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
  40.             b_mc.addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
  41.         }
  42.        
  43.         /**
  44.          * イベントハンドラ
  45.          * @param   e MouseEvent
  46.          */
  47.         private function mouseOver(e:MouseEvent):void {
  48.             //イベントターゲットの名前をtrace
  49.             trace(e.target.name);
  50.         }
  51.     }
  52. }

同じマウスイベントに対して同じような処理を行うMovieClipなどは、同じイベントハンドラをaddEventListenerして、その中でインスタンス名によって処理を分けていたりしたんだけど、子に「InteractiveObject」(DisplayObjectContainer, SimpleButton, TextField)を持つかどうかで、イベントターゲットが異なるので注意。

Adobeのリファレンスガイドにもしっかり書いてありました。

ネストされたノードが関係する場合、マウスイベントは、表示リストで確認できる最も深くネストされたノードをターゲットにします。このノードはターゲットノードと呼ばれます。

2008/10/21追記
すんません!この件、解決しました!

Tags: ,

Leave a Reply