as3 事件机制 三个阶段(优化别人的代码)

import flash.display.*

var mc1=new Sprite(); 
var mc2=new Sprite(); 
var mc3=new Sprite();

this.addChild(mc1);
mc1.addChild(mc2); 
mc2.addChild(mc3);

drawRect(mc1,0xff9900,200); 
drawRect(mc2,0x0000FF,100); 
drawRect(mc3,0xffbbff,50);

function drawRect(obj,c,l):void
{ 
 obj.graphics.beginFill(c) 
 obj.graphics.drawRect(0,0,l,l) 
}

this.addEventListener("click",clickFunc,true);//将addEventListener函数中的第三个参数设为true,则只在捕获阶段侦听,对于没有子对象的元素,事件是不会触发的,只有当子对象同样侦听相同事件时,才会触发事件(因为没有目标阶段).
mc1.addEventListener("click",clickFunc);
mc2.addEventListener("click",clickFunc); 
mc3.addEventListener("click",clickFunc);

function clickFunc(evt:Event):void
{   
 trace("阶段:",evt.target.name+" 是发出事件的目标对象") ;
 trace("阶段:",evt.currentTarget.name+" 是当前捕获事件的目标对象") ;
 trace("阶段:",getPhase(evt.eventPhase)) ;
 trace("") ; //空行
}

function getPhase(phase:int):String
{
 switch (phase)
 {
  case 1: return "捕获阶段";break;
  case 2: return "目标阶段";break;
  case 3: return "冒泡阶段";break;
  default: return"";
 }
}

 
 
output:

阶段: mc3 是发出事件的目标对象
阶段: root1 是当前捕获事件的目标对象
阶段: 捕获阶段

阶段: mc3 是发出事件的目标对象
阶段: mc3 是当前捕获事件的目标对象
阶段: 目标阶段

阶段: mc3 是发出事件的目标对象
阶段: mc2 是当前捕获事件的目标对象
阶段: 冒泡阶段

阶段: mc3 是发出事件的目标对象
阶段: mc1 是当前捕获事件的目标对象
阶段: 冒泡阶段

 
按三级来分的话,点击mc3时:
捕获阶段是在root上的,然后直接到最里层的mc3上是目标阶段,然后mc2,mc1是冒泡阶段,
 
捕获阶段---》目标阶段----》冒泡阶段-----》冒泡阶段
 
 
posted @ 2012-08-20 15:26  ndljava  阅读(215)  评论(0)    收藏  举报