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)
}
AS3中 Event 类的target和currentTarget属性的更多相关文章
- 小程序开发 event对象中 target和currentTarget 属性的区别。
首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素 p包含在div内 在outer上点击时,target跟currentTarget ...
- flex中Event类的使用
当您创建自己的自定义 Event 类时,必须覆盖继承的 Event.clone() 方法,以复制自定义类的属性.如果您未设置在事件子类中添加的所有属性,则当侦听器处理重新分派的事件时,这些属性将不会有 ...
- event对象中 target和currentTarget 属性的区别。
首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素
- JavaScript事件属性event.target和currentTarget 属性的区别。
event.target 获取的是触发事件的标签元素 event.currentTarget 获取到的是发起事件的标签元素 一.事件属性:event.target target事件委托的定义:本来该自 ...
- DOM中Event 对象如何使用
DOM中Event 对象如何使用 一.总结 一句话总结: 1.将event作为参数传递进来,然后就可以调用event对象的各种属性和方法了. <body onmousedown="wh ...
- 微信小程序的target和currentTarget的区别
https://www.jb51.net/article/160886.htm 在小程序的事件回调触发时,会接收一个事件对象,事件对象的参数中包含一个target和currentTarget属性,接下 ...
- JavaScript中创建类,赋值给ajax中的data参数
缘由:因为要给根据是否选中checkbox来动态增加ajax中data的属性(ajax的data属性格式的几种方法,参考http://www.jb51.net/article/46676.htm) d ...
- 3.UML中的类图及类图之间的关系
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...
- GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系
统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...
随机推荐
- Main 程序的入口要做哪些事情
Main 程序的入口要做哪些事: 1.从主类中实例化程序(UIApplication)对象 2.如果有委托的话,从给定的类实例化委托和设置程序(UIApplication) 的代理. 3.开启主事件的 ...
- 有限状态机(FSM)
在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...
- MySQL生成模型
根据数据库表生成Model using System; using System.Collections.Generic; using System.Data; using System.Text; ...
- 推荐Python Web开发测试驱动方法
http://www.cnblogs.com/dkblog/archive/2013/06/14/3135914.html推荐 本人买的时候,京东打8.5折,现在降价啦,本书涵盖啦Django.Sel ...
- 用Struts2拦截器实现文件下载前的验证
思想:用户登录后,将登录信息存储在session中,每次需要验证时,取出来验证 缺陷:没有实现多用户登录时的情况 实行步骤: 登录信息的存储: ActionContext actionContext ...
- PHP入门介绍与环境配置
浏览目录: 一.PHP的背景和优势: 二.PHP原理简介: 三.PHP运行环境配置: 四.编写简单的PHP代码以及测试. 一.PHP的背景和优势 1.1 什么是PHP? PHP是能让你生成动态网页 ...
- 关于java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground的解决办法
今天用一个安卓4.0.4版本的手机测试手上的项目,发现logcat弹出这样一个提示“java.lang.NoSuchMethodError: android.widget.RelativeLayout ...
- 你听说过哪些坑人 or 赚钱的歪点子?真是骗局太多,傻子都不够用啊!
又到了骗术揭秘时间了.各位看客您扶稳做好了,来给你深扒一些行业内幕了. 或者说一些投机的思路. 先提前写一些字,相信你们一会评论时候会用的上.直接复制,比较省力. “这年头傻逼太多,骗子明显不够用啊. ...
- 创建两个对象的两种方法,一中\new,另外一种不new
方法一: String s1=new String("hello"); String s2=new String("hello"); 这里是new了 ...
- 神奇的VIM~转IBM
% 地址范围符号,代表文件中的所有行,作用等同于地址范围 1,$ . 与任意单字符(换行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等. * 与前一字符的0次或多次出现匹配,例 ...