在事件处理过程中,会自动生成事件类的实例,并传给侦听器函数。
通过这个参数就可以使用事件类的属性和方法。其中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) ; // sp2放在sp1中
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属性总是指向被单击的对象,而currentTarget属性指向当前事件活动的对象。
即使在没有发生事件流的处理时,有时也需区别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)
}
====================================================================================
//target是事件侦听器中,事件的发起对象,但target在有嵌套的时候,它是会达到目标底层,打个比方说吧,你有一个mc的容器,mc中还有mc1那么事件的evt.target返回的并不是mc而是mc1,这跟事件流有关,为了确保能返回父容器,我们一般采用currentTarget,就象这样evt.currentTarget来返回事件发送对象的主体。
假如你有一个mc
mc.addEventListener(MouseEvent.CLICK,onClick);
以上是注册了一个侦听器,事件发送者是mc,就是说当我们在mc上单击鼠标的时候,mc会发送一个事件,说白了,就是单击事件。现在我们来看事件的执行者onClick函数:
function onClick(evt:MouseEvent):void
{
//我们要想获取事后发送对象,在事件执行函数中,可以这样返回事件的发送对象,就是mc
evt.target.x=100;
evt.target.y=100;
//如果有嵌套影片剪辑,就得用这个语句:
evt.currentTarget.x=100;
evt.currentTarget.y=100;
}
===========================================================================
AS3中Event的target和currentTarget的区别(事件处理的三个阶段)(转载)
真正的事件dispatch者是event.target,监听事件(addEventListner)的对象是event.currentTarget
例:如为容器mc1创建了一个同类型(或者说拥有相同事件)的子容器mc2,再为mc1注册click事件监听器,当单击子容器mc2时,则event.target指事件dispatch者mc2,而event.currentTarget指当前的事件处理者mc1,因此在使用时如果是要获取被注册事件监听器的对象(一般都是如此)则用event.currentTarget,currentTarget属性应具备两条件,一是它注册了侦听器,二是正在处理事件。
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是事件的调用对象(event dispatcher),currentTarget是事件的处理对象(event processor)。
下面通过例子来了解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);
}
==========================================================================
target 是指向最底层的可接受鼠标事件的对象 如果设置了 mouseChildren = false ,则到达此层就是最底层可接受鼠标事件的对象了。
currentTarget是指事件流的当前阶段侦听对象
as3它的事件机制是按照嵌套关系,在鼠标点击处一直向下遍历,这个过程是事件流机制中的捕获阶段当找到最后一层可以接受鼠标事件的对象时 这叫目标阶段,然后会启动一个向上沿路回流的阶段这叫冒泡阶段。targe在整个事件流机制过程中都是不变的指向, 目标阶段中所存在的最底一层可以接受鼠标的事件对象,而currentTarget则是随着事件流不同的阶段指向流中当前的事件侦听对象,比如一个影片剪辑包裹一个按钮,在按钮上点击 由此至终target都是指向按钮,而如果除了侦听按钮的 MouseEvent.CLICK事件外,还令上层影片剪辑同时侦听 MouseEvent.CLICK事件的话,因为沿途有侦听,在冒泡阶段事件流就会针对这个侦听作出响应,亦即是说只有侦听的对象才会令到 currentTarget对象产生变化这种事件机制的。好处是保证了整个影片所有对象都平等地分享同一个鼠标或键盘等交互事件的消费,不会被提前拦截而令后续对象没法侦听到
========================================================================================
1.target在事件流的目标阶段;currentTarget在事件流的捕获,目标及冒泡阶段。只有当事件流处在目标阶段的时候,两个的指向才是一样的,而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象(一般为父级)。
2.currentTarget属性具备两条件:注册侦听器;正在处理事件。
3.真正的事件dispatch者是event.target,监听事件(addEventListner)的对象是event.currentTarget 。
package
{
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
public class Main extends Sprite
{
public function Main()
{
addEventListener(Event.ADDED_TO_STAGE,addStageHandler);
}
private function addStageHandler(e:Event)
{
removeEventListener(Event.ADDED_TO_STAGE,addStageHandler);
stage.scaleMode = StageScaleMode.NO_SCALE;
var sp1=new Sprite();
var sp2=new Sprite();
sp1.addChild(sp2);
addChild(sp1);
sp1.name = "sp1";
sp2.name = "sp2";
drawRect(sp1,"0xff0000",200,0.5);
drawRect(sp2,"0x00ff00",100,0.4,250);
sp1.mouseEnabled=true;
sp1.addEventListener(MouseEvent.CLICK,clickHandlerOne);
sp2.addEventListener(MouseEvent.CLICK,clickHandlerTwo);
}
private function clickHandlerOne(e:MouseEvent)
{
trace("e.target.name:"+e.target.name);
trace("e.currentTarget.name:"+e.currentTarget.name)
}
private function clickHandlerTwo(e:MouseEvent)
{
trace("sp2:e.target.name:"+e.target.name);
trace("sp2:e.currentTarget.name:"+e.currentTarget.name);
}
private function drawRect(mc:Sprite,color,_width,_alpha,juli:int=0)
{
mc.graphics.lineStyle(1,0x3399ff,0.5);
mc.graphics.beginFill(color);
mc.graphics.drawRect(juli,0,_width,_width);
mc.graphics.endFill();
var txt:TextField=new TextField();
var txtFormat:TextFormat=new TextFormat();
txtFormat.size = 15;
txt.mouseEnabled=false;
txt.text = mc.name;
txt.setTextFormat(txtFormat);
if(mc.name=="sp1")
{
txt.x=mc.width-30;
txt.y=mc.height/2-5;
}
else
{
txt.x=250;
txt.y=5;
}
mc.addChild(txt);
}
}
}
联系客服