新人补钙系列教程之:AS3事件处理--事件流
一个flash应用程序可能会非常复杂,比如,有很多可视实例嵌套在一起,这样的话会形成一个树形结构,这个结构的根是stage,然后一级级到不同的实例,一般来说,要把这个树形结构倒过来看,即stage在顶部,在stage中的实例一级级排列在下面,要参考帮助中的图。
这样的一个树状结构即display list,每个实例(stage也是实例)都是树中的一个节点(node),如何来处理这种复杂结构的事件呢?as3引入了事件流的概念
事件流用于描述事件发生在display list中,遍历其所有node的过程,它可以分为3个阶段:
1、捕获阶段(capture phase):从顶部(如stage)到目标
2、目标阶段(target phase):目标
3、冒泡阶段(bubbling phase):从目标到顶部
看一个例子:
1、建立一个display list,其包含了4个可视实例,root1,mc1,mc2,mc3
import flash.display.*
var mc1=new Sprite()
var mc2=new Sprite()
var mc3=new Sprite()
//this代表root1
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){
obj.graphics.beginFill(c)
obj.graphics.drawRect(0,0,l,l)
}
2、为display list中的所有实例注册click事件侦听器
this.addEventListener("click",clickFunc)
mc1.addEventListener("click",clickFunc)
mc2.addEventListener("click",clickFunc)
mc3.addEventListener("click",clickFunc)
function clickFunc(evt:Event){
trace(evt.currentTarget.name+" is click")
}
}
3、测试一下,单击最小的矩形,看看事件的执行顺序
instance3 is click
instance2 is click
instance1 is click
root1 is click
从顺序中可以看出,事件流采用了冒泡机制,即从单击的目标(instance3)开始,向顶部流动,最后到达root1。
通过
trace(evt.eventPhase)
可以知道事件流的阶段,结果如下:
instance3 is click
2
instance2 is click
3
instance1 is click
3
root1 is click
3
2代表目标阶段,相应的实例即你所单击的实例,3代表冒泡阶段。
如果要使事件流使用捕获机制,在注册侦听时应多加一个参数,把useCapture参数设置为true
this.addEventListener("click",clickFunc,true)
如果两种机制都要使用,须注册两次侦听器,useCapture的的值分别为true,false
事件对象是Event类的实例,具有多个属性,其中target与currentTarget属性必须把它们分精楚。
对于一个简单的事件处理过程,分清target与currentTarget并没有必要,因为它们一般指向同一个对象,如对一个简单的mc容器注册侦听器,在处理事件过程中,这两个属性都指向了这个mc。
但在一个相对复杂的display list中,这两属性是不相同的,比如,在主场景中有一个实例名为mc的影片剪辑实例,此mc包含了一个子mc,假设实例名为mc1
如果为父级即mc注册一个click事件侦听器,当单击mc时,target与currentTarget都指向mc,当单击mc1时,target指向mc1,而currentTarget指向mc,因此,在很多应用中,可能有人会认为currentTarget会指向父级。
如果为子级和父级都注册一个侦听器,那target是指单击的目标,而currentTarget是指在处理事件(即活动)的目标,因为as3的事件处理有3个阶段(捕获、目标、冒泡),并且缺省时采用冒泡机制,当单击子级mc1时,currentTarget应先指向底层,并向上冒泡,即先指向mc1,再指向mc
所以,currentTarget属性应具备两条件,一是它注册了侦听器,二是正在处理事件,而target就指事件流中的target。例如,单击了mc1,不管事件如何冒泡(不管currentTarget指向谁),target都指向mc1,
小结:target属性在事件流的目标阶段,而currentTarget属性在事件流的冒泡阶段(如currentTarget有时指父级)和目标阶段(两属性的指向相同),当然也可以是捕获阶段。 (转载)
新人补钙系列教程之:AS3事件处理--事件流的更多相关文章
- 新人补钙系列教程之:AS3 与 PHP 简单通信基础
package { import flash.display.Loader; import flash.events.Event; import flash.net.URLLoader; import ...
- 新人补钙系列教程之:AS3 位运算符
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...
- 新人补钙系列教程之:拒绝CPU高占用
1.关于MovieClip和Sprite的鼠标事件,当不需要鼠标事件的时候将mouseEnabled和mouseChildren设为false. 不断的检测鼠标交互事件会消耗CPU,尤其是大量交互对象 ...
- 新人补钙系列教程之:3D理论 - 二进制空间分割(BSP)树
1. 什么是BSP树 BSP算法的初始数据是一个多边形集,BSP在预处理的时候先在多边形集中选取一个多边形作为支持平面,然后根据这个平面将集合划分成两个部分,每个部分是一个新的子节点,递归进行该过程, ...
- 新人补钙系列教程之:体验ApplicationDomain 应用程序域
要说应用程序域,就不得不说安全沙箱 安全沙箱在帮助文档的解释是: 客户端计算机可以从很多来源(如外部 Web 站点或本地文件系统)中获取单个 SWF 文件.当 SWF 文件及其它资源(例如共享对象.位 ...
- 新人补钙系列教程之:AS 与 JS 相互通信
比较常用的,AS 调用 JS private function callJS():void{ ExternalInterface.addCallback("callbackQQPay&quo ...
- 新人补钙系列教程之:Molehill底层API中最重要的Context3D
Context3D,是一个三维空间的处理环境,负责创建并处理三维对象的各个要素如顶点.片段.透视等等,并将处理的结果使用AGAL(Adobe图形汇编语言)上传给显卡进行运算,运算结果最终被回传给CPU ...
- 新人补钙系列教程之:XML处理方法
初始化XML对象XML对象可以代表一个XML元素.属性.注释.处理指令或文本元素.在ActionScript 3.0中我们可以直接将XML数据赋值给变量: var myXML:XML = <or ...
- kali linux 系列教程之metasploit 连接postgresql可能遇见的问题
kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂 目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...
随机推荐
- h5滚动条加载到底部
https://www.zhihu.com/question/31861301 重复加载问题 http://www.jianshu.com/p/12aa901bee1f?from=timeline w ...
- 转 android Listview,gridview局部刷新,部分刷新 (仿QQ动态评论局部刷新)
转自:http://blog.csdn.net/jdsjlzx/article/details/45582719 众所周知Listview和Gridview的刷新界面的方式是调用adapter.not ...
- 洛谷noip 模拟赛 day1 T3
T7983 大芳的逆行板载 题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇 ...
- Git 新项目关联到远程仓库
最近前端学到小有成果,准备写一个新项目放在githup,结果没有提前在仓库创建项目,现在我把写好的项目推送到远程gitHup 1.先初始化本地仓库 Git init : 这样在项目里面都创建了一个隐藏 ...
- MySQL-based databases CVE -2016-6663 本地提权
@date: 2016/11/3 @author: dlive 0x01 漏洞原文 翻译水平不高求轻喷 感觉作者在写文章的时候有些地方描述的也不是特别清楚,不过结合poc可以清晰理解漏洞利用过程 0x ...
- 高级全局API钩取 - IE连接控制
@author: dlive @date: 2017/02/14 0x01 调试IE进程 常见网络连接库:ws2_32.dll(套接字),wininet.dll,winhttp.dll 使用Proce ...
- mysql 共享空间转为独立表空间
由于以前的mysql配置为共享表空间,服务器空间不足,清理日志表里的数据后,数据库并没缩小,照成空间浪费,现在修改为独立表空间 #独立表空间innodb_file_per_table=1 #停止事物日 ...
- python 错误 error: invalid command 'egg_info'
Processing /bs4-0.0.1/setuptools-38.4.0/numpy-1.14.0 Complete output from command python setup.py ...
- jquery做一个表单验证
正则表达式的写法: var re=new RegExp('规则', '可选参数');var re=/规则/参数;(这个最常用) 正则表达式的规则 和其他语言的正则表达式规则一样,可以参考我的另一边博文 ...
- [BZOJ4989][Usaco2017 Feb]Why Did the Cow Cross the Road 树状数组维护逆序对
4989: [Usaco2017 Feb]Why Did the Cow Cross the Road Time Limit: 10 Sec Memory Limit: 256 MBSubmit: ...