AS3中 Event 类的target和currentTarget属性

在事件处理过程当中,会自动生成事件类的实例,并传给侦听器函数。经过这个参数就可使用事件类的属性和方法。其中target与currentTarget属性是两个很类似的属性。
 对于简单的事件处理过程,分清target与currentTarget并无必要。由于它们通常指向同一个对象。例如,舞台中有一个实例名为mc的影片剪辑实例,经过下面的代码为这个实例注册单击事件。

mc.addEventListener(MouseEvent.CLICK,this.test);
function test(e:MouseEvent)
{
   trace(e.target.name,e.currentTarget.name);
}
 输出结果是同样的,target与currentTarget属性都是引用舞台中的影片剪辑实例。但在一个相对复杂的显示列表中,这两个属性是不相同的。
 下面经过例子来了解target与currentTarget属性的异同
1、新建Flash文档
2、改图层1名为as,单击图层的第1帧,打开动做面板,输入代码: 
var sp1:Sprite=new Sprite() ; 
var sp2:Sprite=new Sprite() ; 
  
this.addChild(sp1) ; 
sp1.addChild(sp2) ; 
  
drawRect(sp1,0xff0000,200) ; 
drawRect(sp2,0x0000FF,100); 
  
//绘制矩形 
function drawRect(obj:DisplayObject,c:uint,l:int):void; 
{ 
   obj.graphics.beginFill(c) ; 
   obj.graphics.drawRect(0,0,l,l) ; 
} 
上面的代码在主时间轴中建立了Sprite类的实例sp1,在sp1实例内又建立了Sprite类的实例sp2。若是为父级sp1注册一个单击事件侦听器,当单击sp1时,target与currentTarget都指向sp1,当单击sp2时,target指向sp2,而currentTarget指向sp1。所以在不少应用中,通常认为currentTarget指向父级。代码以下: 
sp1.name="sp1"; 
sp2.name="sp2"; 
sp1.addEventListener(MouseEvent.CLICK,clickFunc); 
  
function clickFunc(e:MouseEvent):void 
{ 
   trace(e.target.name,e.currentTarget.name); 
   
} 
3、测试影片,分别单击大小矩形,查看信息
 若是为子级和父级都注册一个侦听器,那target属性是指单击的目标,而currentTarget属性是指在处理的事件即活动目标,由于3.0的事件处理有捕获、目标、冒泡3个阶段,而且默认时采用冒泡机制,当单击子级时,currentTarget属性应先指向目标,并向上冒泡,就是先指向sp2,再指向sp1。
 为程序增长sp2注册事件侦听器: 
sp1.addEventListener(MouseEvent.CLICK,clickFunc); 
sp2.addEventListener(MouseEvent.CLICK,clickFunc); 
function clickFunc(e:MouseEvent):void 
{ 
   trace(e.target.name,e.currentTarget.name); 
} 
所以,currentTarget属性应具有两个条件,一是它注册了侦听器,二是正在处理事件,而target属性就指事件流中的目标,例如,单击了sp2,无论事件如何冒泡或说无论currentTarget指向谁,target都指向sp2。
 target属性在事件流的目标阶段,而currentTarget属性在事件流的冒泡阶段、目标阶段和捕获阶段。以单击事件为例,只有事件流处于目标阶段时,currentTarget属性与target属性的指向才相同,当事件流处于冒泡阶段和捕获阶段时,target属性老是指向被单击的对象,而cu rrentTarget属性指向当前事件活动的对象。
 即便在没有发生事件流的处理时,有时也需区别target和currentTarget属性,好比在舞台中建立mc1,在mc1中又建立mc2,且mc2位于mc1的上面。
 当对父级对象即mc1处理事件时,使用下面的代码1: 
mc1.addEventListener(MouseEvent.CLICK,fun) 
function fun(e:MouseEvent) 
{ 
trace(e.target.name) 
} 
测试影片时,单击mc1,输出mc1,单击mc2,则输出mc2。若是要使用e.target属性始终指向mc1,可使用容器对象的mouseChildren属性:

mc1.mouseChildren = false;

 当mc1的mouseChildren属性被设置成 false后,mc1的子级对象将不能处理鼠标事件,此时无论单击mc1仍是mc2输出的都是mc1。代码2: 
mc1.mouseChildren=false 
mc1.addEventListener(MouseEvent.CLICK,fun) 
function fun(e:MouseEvent) 
{ 
trace(e.target.name) 
} 
因为currentTarget属性指向当前事件活动的对象,而mc1注册了单击事件,mc2没有注册单击事件,即mc1的事件是活动的。所以无论单击mc1仍是mc2,currentTarget属性确定指向mc1。
代码3; 
mc1.addEventListener(MouseEvent.CLICK,fun) 
function fun(e:MouseEvent) 
{ 
trace(e.currentTarget.name) 
} 
相关文章
相关标签/搜索