一个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事件处理--事件流的更多相关文章

  1. 新人补钙系列教程之:AS3 与 PHP 简单通信基础

    package { import flash.display.Loader; import flash.events.Event; import flash.net.URLLoader; import ...

  2. 新人补钙系列教程之:AS3 位运算符

    ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数).在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢? 有符号整数使用 3 ...

  3. 新人补钙系列教程之:拒绝CPU高占用

    1.关于MovieClip和Sprite的鼠标事件,当不需要鼠标事件的时候将mouseEnabled和mouseChildren设为false. 不断的检测鼠标交互事件会消耗CPU,尤其是大量交互对象 ...

  4. 新人补钙系列教程之:3D理论 - 二进制空间分割(BSP)树

    1. 什么是BSP树 BSP算法的初始数据是一个多边形集,BSP在预处理的时候先在多边形集中选取一个多边形作为支持平面,然后根据这个平面将集合划分成两个部分,每个部分是一个新的子节点,递归进行该过程, ...

  5. 新人补钙系列教程之:体验ApplicationDomain 应用程序域

    要说应用程序域,就不得不说安全沙箱 安全沙箱在帮助文档的解释是: 客户端计算机可以从很多来源(如外部 Web 站点或本地文件系统)中获取单个 SWF 文件.当 SWF 文件及其它资源(例如共享对象.位 ...

  6. 新人补钙系列教程之:AS 与 JS 相互通信

    比较常用的,AS 调用 JS private function callJS():void{ ExternalInterface.addCallback("callbackQQPay&quo ...

  7. 新人补钙系列教程之:Molehill底层API中最重要的Context3D

    Context3D,是一个三维空间的处理环境,负责创建并处理三维对象的各个要素如顶点.片段.透视等等,并将处理的结果使用AGAL(Adobe图形汇编语言)上传给显卡进行运算,运算结果最终被回传给CPU ...

  8. 新人补钙系列教程之:XML处理方法

    初始化XML对象XML对象可以代表一个XML元素.属性.注释.处理指令或文本元素.在ActionScript 3.0中我们可以直接将XML数据赋值给变量: var myXML:XML = <or ...

  9. kali linux 系列教程之metasploit 连接postgresql可能遇见的问题

    kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂   目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...

随机推荐

  1. zoj 1002 Fire Net (二分匹配)

    Fire Net Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose that we have a square city with s ...

  2. Glibc说明

    Glibc glibc是gnu发布的libc库,也即c运行库.glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc.glibc除了封装linux操作 ...

  3. 刷题总结——子串(NOIP2015)

    题目: 题目背景 NOIP2015 提高组 Day2 T2 题目描述 有两个仅包含小写英文字母的字符串 A 和 B .现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在 ...

  4. Yum只更新安全补丁的方法

    当大家想只给RHEL系统更新安全补丁的时候,往往会把其他一些无用的组件给更新下来,现在就给大家说下怎么只更新安全补丁而又不更新其他组件. 1.安装yum插件即可:   yum install yum- ...

  5. eclipse搭建ssm框架的maven的工程

    版本:eclipse:Indigo Service Release 2.  jdk :jdk1.7.0_03. maven:apache-maven-3.3.3 . 上面的3个东西 先下载下来.然后运 ...

  6. 转:Java SoftReference 使用构建对象缓存

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用   在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说, ...

  7. Android横竖屏总结(转)

    Android横竖屏总结(转) 横竖屏切换后Activity会重新执行onCreat函数,但是在Android工程的Mainfest.xml中加入android:screenOrientation=& ...

  8. linux 路由表设置 之 route 指令详解【转】

    转自:http://blog.csdn.net/vevenlcf/article/details/48026965 目录(?)[-] 种路由类型 主机路由 网络路由 默认路由 配置静态路由 route ...

  9. UVALIVE 2927 "Shortest" pair of paths

    裸的费用流.一开始因为这句话还觉得要拆点 样例行不通不知道这句话干啥用的.Further, the company cannot place the two chemicals in same dep ...

  10. Zabbix监控服务器异常IP登录

    保存下面的脚本到任意路径 名字.py 修改属组和权限: chown zabbix:zabbix * chmod 755 * 演示的路径为:/usr/local/zabbix/scripts/ # -* ...