`

Flash的事件机制

阅读更多
1.先说一些基础的东西(直接从网上copy过来)

(1) 事件是一个对象,它由flash play产生和管理。事件流分捕获阶段,目标阶段和冒泡阶段。事件流的示意图如下,这里说明一下target和 currentTarget的概念。当一个事件流产生时,就产生了一个显示对象列表,而target是最里层的对象,而 currentTarget是捕获阶段和冒泡阶段被"遍历"的显示对象,当然它只有注册了时间监听器,我们才能获得 event.currentTarget。


(2)
   <1> 捕获阶段 (EventPhase.CAPTURING_PHASE)包括从舞台到目标节点范围内的所有节点
    <2> 目标阶段 (EventPhase.AT_TARGET)权包括目标节点
    <3> 冒泡阶段 (EventPhase.BUBBLING_PHASE)从目标节点的父节点返回到舞台的行程中遇到的节点


(3)不是所有的事件都有这三个阶段。如Timer、URLLoader,它们的事件对象将直接派送给目标对象(target).它们只包含目标阶段而没有捕获阶段和冒泡阶段。它们不会像显示对象容器(DisplayObjectContainer)那样有可能被一个DisplayObjectContainer对象包含或者自己包含一个DisplayObjectContainer对象,它们往往是单独存在的。也就是说如果一个显示对象不在显示列表中时,FlashPlaye会把事件直接派送给它,这个时候就没有事件流,也没有捕获阶段和冒泡阶段,只有目标阶段。





(1)请仔细看上面的图中的事件流,图中的假定的事件派发的对象是子节点1,从图中我们可以看出,事件流并没有经过子节点2,也就是说如果子节点2中监听事件,那子节点无法监听到事件。
(2)如果如果父节点监听子节点1的事件可以监督到吗?当然可以因为事件流有经过父节点;有两种方式可以监听到子节点1的事件:
  自定义事件:
    1)在父节点里面用子节点监听事件(如子节点1.addEventListener(。。。。))此时不需要设置addEventListener中的useCapture参数和new Event时Event的bubbles参数。就可以直接监听到子节点1的事件,因为此时直接在目标阶段捕捉事件。
    2)直接用在父节点中加入但是addEventListener(。。。)也可以监听子节点1的事件,但是前提条件是在父节点监听事件的时候要把addEventListener中的useCapture参数设置成true(如addEventListener(MenuEvent.MENU_Event, handler,true)或者字节点1中new Event时将Event的bubbles参数设置为true( new MenuEvent(MenuEvent.MENU_Event,true))。如果都不这样的话,父节点是无法监听到事件的。



因为addEventListener中的useCapture的default模式是false也就是侦听器只在目标或冒泡阶段处理事件,而new Event时将Event的bubbles参数default也是false也就是说不参与事件流的冒泡阶段。如果不设置useCapture或者bubbles为true那父节点肯定无法监听到事件。
(3)如果非要在子节点2中监听子节点1中发出的事件怎么办?
    1)办法有很多种,说一下最常用的一种,就是向子节点1 与子节点2 都传入一个相同的对象的实例,在子节点1中用这个对象实例发出事件,在子节点2中用这个对象实例监听事件(在目标阶段捕获事件)。这样就可以收到字节点1的事件了。
  非自定义事件(如mouseEvent):
   1)当是非自定义事件时。直接用在父节点中加入但是addEventListener(。。。)就可以监听子节点1的事件。
   2)有人可能要问如果我要在子节点2监听子节点1的非自定义事件呢?可以用(上面的2 标题里面 3)),但是完全没有必要,比如,你说你在子节点2中监听子节点1的mouseClick 事件干吗??


摘录Flash帮助文档中的规范解释:

addEventListener () 方法

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

语言版本 :  ActionScript 3.0
RuntimeVersions:  AIR 1.0, Flash Player 9



使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。可以为特定类型的事件、阶段和优先级在显示列表的所有节点上注册事件侦听器。

成功注册一个事件侦听器后,无法通过额外调用 addEventListener() 来更改其优先级。要更改侦听器的优先级,必须首先调用 removeListener()。然后,可以使用新的优先级再次注册该侦听器。

请记住,注册该侦听器后,如果继续调用具有不同 type 或 useCapture 值的 addEventListener(),则会创建单独的侦听器注册。例如,如果首先注册 useCapture 设置为 true 的侦听器,则该侦听器只在捕获阶段进行侦听。如果使用同一个侦听器对象再次调用 addEventListener(),并将 useCapture 设置为 false,那么便会拥有两个单独的侦听器:一个在捕获阶段进行侦听,另一个在目标和冒泡阶段进行侦听。

不能只为目标阶段或冒泡阶段注册事件侦听器。这些阶段在注册期间是成对出现的,因为冒泡阶段只适用于目标节点的始祖。

如果不再需要某个事件侦听器,可调用 removeEventListener() 删除它,否则会产生内存问题。由于垃圾回收器不会删除仍包含引用的对象,因此不会从内存中自动删除使用已注册事件侦听器的对象。

复制 EventDispatcher 实例时并不复制其中附加的事件侦听器。(如果新近创建的节点需要一个事件侦听器,必须在创建该节点后附加该侦听器。) 但是,如果移动 EventDispatcher 实例,则其中附加的事件侦听器也会随之移动。

如果在正在处理事件的节点上注册事件侦听器,则不会在当前阶段触发事件侦听器,但会在事件流的稍后阶段触发,如冒泡阶段。

如果从正在处理事件的节点中删除事件侦听器,则该事件侦听器仍由当前操作触发。删除事件侦听器后,决不会再次调用该事件侦听器(除非再次注册以备将来处理)。


参数  type:String — 事件的类型。 
 
listener:Function — 处理事件的侦听器函数。此函数必须接受 Event 对象作为其唯一的参数,并且不能返回任何结果,如下面的示例所示:
function(evt:Event):void函数可以有任何名称。

 
useCapture:Boolean (default = false) — 确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果 useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。要在所有三个阶段都侦听事件,请调用 addEventListener 两次:一次将 useCapture 设置为 true,一次将 useCapture 设置为 false. 
 
priority:int (default = 0) — 事件侦听器的优先级。优先级由一个带符号的 32 位整数指定。数字越大,优先级越高。优先级为 n 的所有侦听器会在优先级为 n -1 的侦听器之前得到处理。如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为 0。 
 
useWeakReference:Boolean (default = false) — 确定对侦听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的侦听器被当作垃圾回收。弱引用则没有此作用。
类级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将 useWeakReference 设置为 true 而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将 useWeakReference 设置为 true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。
  • 大小: 13.3 KB
分享到:
评论

相关推荐

    flash action script

    flash事件侦听机制,事件流,捕捉机制,事件处理

    AS3.0语言在Flash编程中的应用

    摘要 1、绪论 ... 2、AS3的事件侦听机制 3、在AS3中改变对象的位置和缩放对象 4、演示 3、XML的运用 1、新建FLASH 2、创建 viewer.as 的类 3、创建pics,xml 的文件 4、总结 5、致谢 6、参考文献

    Flash_Class_Library.rar_class_flashcla

    flash强大事件机制扩展类,来自蓝色理想论坛,与各位flash爱好者分享

    Flash ActionScript 3.0学习指南

    全书内容包括ActionScript 3.0 语言介绍、ActionScript3.0基本语法、事件机制、面向对象、数组、正则表达式、XML应用、常用的内置类、基本组件、数据列表组件、 DataGrid组件、文本处理、绘图、几何结构、音频、视频...

    Flash ActionScript 3.0编程技术教程(全)

    第1~5章介绍了 ActionScript 3.0的基础知识,包括程序编写界面、数据结构、基本语法以及事件机制;第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、...

    flash在C#中的应用

    该类中包含各种Flash的事件和属性,在这里我们只对右键菜单的事件感兴趣,因此我们去重写该事件。 类的代码如下: public class FlashRightKey : AxShockwaveFlashObjects.AxShockwaveFlash { //定义一个公共...

    Flash ActionScript 3.0编程技术教程

    第1~5章介绍了 ActionScript 3.0的基础知识,包括程序编写界面、数据结构、基本语法以及事件机制;第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、...

    Flash中ActionScript语言的使用分析 pdf

    摘 要:F1ash做为目前最流行的动画制作软件,其就业市场相当广泛,因而在各大院校计算机专业全部将该课程列为专业主干课,非计算 机专业也多将此课程列为选修课,以拓宽学生的就业途径。...事件机制

    Flash ActionScript 3.0 编程技术教程(附书光盘)

    第1~5章介绍了ActionScript 3.0的基础知识,包括程序编写界面、数据结构、基本语法以及事件机制;第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、ActionScript...

    EventDispatcher:为常规的Lua对象提供自定义事件广播侦听器机制

    EventDispatcher为常规的Lua对象提供了广播器/侦听器事件机制。 Corona SDK开发人员可以编写更简洁的面向对象的代码,该代码不依赖于从显示对象或自定义消息的全局运行时发送消息。 该模块在Corona SDK和其他可能...

    swfupload批量上传组件

    SWFUpload最初是由Vinterwebb.se开发的一...不幸的是Flash Player 10 更严格的安全机制迫使我们不得不将一个Flash Button放入Flash影片中。SWFUpload提供API供开发者通过图片、文字、CSS的方式来自定制更灵活的UI显示。

    SWFUpload v2.2.0.1 多文件上传控件(带中文文档)

    SWFUpload最初是由Vinterwebb.se开发的一...不幸的是Flash Player 10 更严格的安全机制迫使我们不得不将一个Flash Button放入Flash影片中。SWFUpload提供API供开发者通过图片、文字、CSS的方式来自定制更灵活的UI显示。

    Canvas图形框架Canvax.zip

    小型轻便的 canvas 图形框架,支持像操作dom一样的 进行canvas编程, 在canvas开发中的对象模型和事件绑定机制拉到了和 dom svg 等开发的同等水平,那么,你还在犹豫什么。 标签:Canvax

    LionEvents:这是类似于Adobe ActionScript 3.0的事件流

    LionEvents LionEvents是一个模仿Adobe Flash Acrionscript 3.0中事件机制的框架。最大的优点是没有选择器,也没有带前缀@obj的私有函数。 使用LionEvents,您可以进行更有效的封装,并降低耦合度。 LionEvents提供...

    jquery.zeroclipboard:绑定到“ beforecopy”,“ copy”,“ aftercopy”和“ copy-error”事件,使用jQuery的特殊事件API和ZeroClipboard的Core模块生成的用于剪贴板注入的自定义类DOM事件。

    jquery.zeroclipboard ...ZeroClipboard需要使用Flash Player 11.0.0或更高版本。 有关基础机制的更多详细信息,请参见 。 通过ZeroClipboard v2.x的智能默认配置值以及内部覆盖一些配置选项,使得该插件

    FLEX企业应用开发实战.part1

     1.4.3 Flash中的事件机制  1.5 小结 第2章 Flex企业应用开发基础  2.1 MXML语言  2.1.1 用MXML表示ActionScript对象  2.1.2 查看由MXML文件所翻译的ActionScript代码  2.1.3 IMXMLObject接口  2.2 ...

    FLEX企业应用开发实战.part2

     1.4.3 Flash中的事件机制  1.5 小结 第2章 Flex企业应用开发基础  2.1 MXML语言  2.1.1 用MXML表示ActionScript对象  2.1.2 查看由MXML文件所翻译的ActionScript代码  2.1.3 IMXMLObject接口  2.2 ...

    BLE蓝牙-4.0-学习笔记

    蓝牙4.0 BLE center与peripheral建立连接绑定过程 2 蓝牙4.0 BLE peripheral 广播设置 7 ...蓝牙4.0 BLE key处理过程看任务、事件、消息机制 50 CC254x 内部存储结构 FLASH 53 蓝牙4.0 BLE FLASH 操作 58

    AS3 Gaia FrameWork

    Gaia强大的自定义和事件侦听功能使用户可以很方便的更改网站逻辑。此外Gaia还整合了SWFAddress,GreenShock Tween,采用MVC,Singleton等设计模式和业界流行的最佳解决方案(Best Practice)。Gaia还提供了配套的...

Global site tag (gtag.js) - Google Analytics