`
saboo
  • 浏览: 70492 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转]AS3事件处理机制

    博客分类:
  • Flex
阅读更多

先来看个例子:
地点:饭馆类(extend Sprite or UIcomponent...,是个容器就行)
人物:客人类(extend EventDispatcher,会说话就行)、厨师类(extend Object,能

满足客人需求就行)

一、四个步骤:注册侦听、分发事件、侦听事件、移除侦听。
(1)、注册侦听:客人进入饭馆,使用addEventListener指定某厨师准备做菜。
(2)、分发事件:客人使用dispatchEvent对厨师进行喊话,表示我要吃什么。喊话内

容被放在Event类或其子类里,主要包括类型、目标和数据三部分。类型(Type)就是点

菜,而不是结账,上酒水。目标(Target)用来记录是哪桌的客人。数据(Data)用来保

存重要信息,如果是点菜,那记的就是菜名。
(3)、侦听事件:根据注册侦听中的需求,厨师开始做菜。
(4)、移除侦听:不移除的后果就是,以后在任意餐馆里喊话叫菜,所有注册过侦听的

餐馆厨师都开始做菜。
一些细节:
(1)、为了方便客人类在饭馆类中使用MXML标签注册侦听,常常在客人类中使用Event

标签。比如[Event(name="onChange", type="components.MyEventTest")]
(2)、注册侦听时,可以使用弱引用,即更改addEventListener中的useWeakReference

属性的默认值false为true。这样垃圾回收器会检测弱引用侦听并自动移除,极其不建

议这样做,而是直接移除侦听。
(3)、当客人类已经继承了某类,无法再继承EventDispatcher时,可以考虑实现

IEventDispatcher接口。额外地,需要实现此接口定义的五个方法addEventListener

、dispatchEvent、willTrigger、removeEventListener和hasEventListener。当然,

在实现过程中,可以灵活地添加别的新特性。

二、事件流机制
(1)、捕获阶段:Flash Player会按照显示列表,从根容器舞台往下找,直到确定是哪

个桌的客人在喊话要菜。
(2)、目标阶段:捕获阶段结束时停在哪个目标对象上。
(3)、冒泡阶段:事件对象从目标对象再次沿显示列表往上移动至根容器舞台,遇到注

册侦听的节点就调用侦听函数。如果想中途中断冒泡,可以使用stopPropagation,详

见文末Event备注部分。
一些细节:
(1)、这三个阶段由Event中的eventPhase属性来记录,1表示捕获,2表示目标,3表示

冒泡。
(2)、目标阶段确定的目标对象由Event中的target属性来记录,冒泡阶段移动的游标

则由currentTarget来记录。事件对象每往上移动一级,就会克隆出一个仅与前副本

currentTarget不同的新副本。这也提示我们,在自定义Event类时,如果打开了冒泡

属性bubbles,则必须要覆盖原有的clone方法,否则在冒泡时就会丢失自定义的存储

数据。同样,最好也覆盖原有的toString方法。
(3)、侦听器的调用一般发生在冒泡阶段。但是当target等于currentTarget,也就是

当前侦听对象就是事件发生对象时,冒泡阶段就没有了,这时目标阶段就发生了侦听

器调用。如果希望在捕获阶段侦听事件,将addEventListener中的useCapture参数改

为true即可,这时冒泡阶段将不再发生侦听。如果希望仍在冒泡阶段继续侦听,需要

新添加一个useCapture为默认值false的侦听。
(4)、事件对象是否可以冒泡要看两点:第一,事件本身是否支持冒泡,由bubbles属

性设定,为true则支持,默认为false;第二,如果事件发生的对象不在显示列表中,

也不可能冒泡,此时只有目标阶段,如Timer和URLLoader。
(5)、显示列表下,某个容器中有两个并列子节点1和2。如果子节点1发出事件,需要

在子节点2中进行侦听,默认情况下是做不到的。常用的一种办法是向子节点1和子节

点2都传入一个相同的对象的实例,在子节点1中用这个对象实例发出事件,在子节点2

中用这个对象实例监听事件(在目标阶段捕获事件)。这样就可以收到字节点1的事件

了。

三、Event备注
属性:
bubbles:只读,布尔,事件是否开启冒泡功能 
cancelable:只读,布尔,处理事件的默认行为是否可以停止。主要针对一些系统事

件,如果值为true,则Event的preventDefault方法可以使用,否则不可用。 
currentTarget:只读,对象,当前正在调用监听器的对象 
eventPhase:只读,整数,返回事件流正经历的阶段。1:捕获,2:目标,3:冒泡 
target:只读,派发事件的目标对象 
type:只读,字符,事件类型。比如鼠标点击事件的类型:click,并被定义为常量:

MouseEvent.CLICK

构造函数:
Event(
  type:String,    事件类型
  bubbles:Boolean = false,   是否冒泡
  cancelable:Boolean = false  是否可以停止
)

方法:
isDefaultPrevented:判断preventDefault 是否已经被调用
preventDefault:停止事件的默认行为。针对一些系统事件,cancelable为true时才

可用。 
stopImmediatePropagation:停止当前的事件流传播,包括当前正在处理的对象 
stopPropagation:停止当前的事件流传播,但不会停止当前正在处理的对象

四、侦听器备注

addEventListener(
  type:String,    事件的类型
  listener:Function,    监听函数
  useCapture:Boolean = false,    是否打开捕获功能 
  priority:int = 0,    监听器优先级别
  useWeakReference:Boolean = false    是否使用弱引用
)

默认情况下,Flex会按照监听器注册的顺序来调用监听函数。使用addEventListener

函数的priority 来实现 监听函数的优先级。priority 为整数类型,数字越大,级别

越高。级别最高的最先被调用。已经存在的监听器,无法被修改优先级。使用MXML添

加的事件监听函数无法指定优先级别,将采用默认的级别。给一个对象注册多个监听

器,即使每个监听器的优先级别不同,但也无法保证后一个执行时前面的监听函数已

经执行完毕。设计时,后面的函数不应该以前者执行完毕为条件。

 

分享到:
评论

相关推荐

    AS3中的事件处理.txt

    事件处理系统是交互式程序设计的重要基础。利用事件处理机制,可以方便的相应用户输入和系统事件。ActionScript 3.0的事件机制基于文档对象模型(DOM3)。

    flex事件机制分析

    简要说明了flex的事件流、事件处理等方面的知识。

    Python异常处理机制结构实例解析

    首先,Python 完整的异常处理语法结构如下: try: #业务实现代码 except Exception1 as e: #异常处理块1 ... except Exception2 as e: #异常处理块2 ... #可以有多个 except ... else: #正常处理块 finally :...

    asp.net 的错误处理机制讲解

    程序健壮性最基本要求就是程序错误的处理与捕捉,在ASP.NET中,错误的处理有和其他编程语言一样的机制,可以使用Try…Catch…Finally等方式,这一点和ASP相比具有较大的进步。而且,使用这些错误处理方法,可以大大...

    javascript打造跨浏览器事件处理机制[Blue-Dream出品]

    首先,DOM Level2为事件处理定义了两个函数addEventListener和removeEventListener, 这两个函数都来自于EventTarget接口. 代码如下: element.addEventListener(eventName, listener, useCapture); element....

    利用Javascript实现一套自定义事件机制

    事件机制为我们的web开发提供了极大的方便,使得我们能在任意时候指定在什么操作时做什么操作、执行什么样的代码。 如点击事件,用户点击时触发;keydown、keyup事件,键盘按下、键盘弹起时触发;还有上传控件中,...

    详解javascript跨浏览器事件处理程序

    本文为大家分享了javascript跨浏览器事件处理机制,供大家参考,具体内容如下 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>跨浏览器的事件处理程序</...

    SAEAS6802-2011

    2011年颁布的开放标准AS6802,它继承了IEEE1588协议中的透明时钟机制,同时在同步处理过程中,增加了一系列容错机制,有效解决了IEEE 1588协议无法进行容错处理的缺陷;同时AS6802中引入了全局时间基准,网络节点的...

    as.net本质论

    第1~4章是ASENET的核心部分,细致地剖析了ASP.NET中的请求处理机制、ASP.NET中的对象与HTTP之间的映射关系、应用程序处理管道的处理过程、处理程序的处理机制,以及多线程技术在ASENET中的应用。第5~8章是经典的...

    Javascript处理DOM元素事件实现代码

    但是浏览器有addEventListener和attachEvent方法可供调用,从而模拟出类似于C#中的事件委托的事件触发机制! 代码如下: /* * 功能:事件处理 * Author:LQB * 时间:2009-1-4 * #include JCore.js */ var JEvents = ...

    VB6MouseWheel.zip

    vb6控件一般都不支持【鼠标滚轮滚动事件】,那么我们利用消息处理机制(Hook消息处理函数),给控件增加一个鼠标滚轮滚动事件。 资源【VB6MouseWheel.zip】中包含VB6源码+示例exe。 代码示例是给一个文本框text...

    详解javascript中的事件处理

    事件传播机制  客户端JavaScript程序(就是浏览器啦)采用了异步事件驱动编程模型。当文档、浏览器、元素或与之相关的对象发生某些有趣的事情时,Web浏览器就会产生事件(event)。如果JavaScript应用程序关注特定...

    Java-Signals:Java Signals是基于Robert Penner针对AS3的Signals的事件管理系统

    信号(不要与JVM的本机信号处理相混淆)本质上是一种自包含的事件调度机制。 每个信号对应一个唯一的事件,该事件包含其自己的侦听器列表和事件数据类型。 每个事件只需要一个Signal实例,不需要额外的常量或子类。...

    详解Javascript事件驱动编程

    PS:这种方式和Java GUI中的事件监听机制很像,都是需要注册监听,然后再处理监听,只不过实现的方式不同而已。 二、事件驱动原理 事件源:产生事件的地方(html元素) 事件:点击/鼠标操作/键盘操作等等 事件对象...

    基于LSTM和注意力机制预测蛋白质python源码(配体结合亲和力)+数据+代码注释.zip

    基于LSTM和注意力机制预测蛋白质python源码(配体结合亲和力)+数据+代码注释.zip 一、环境: 首先,创建一个Conda环境,并为运行实验安装一些必要的软件包。 TensorFlow 2.0 pandas库 Numpy库 Openbabel软件 mdtraj...

    HTML5 Canvas的事件处理介绍

    然而这种DOM处理方法在HTML5的Canvas里不再适用,Canvas使用的是另外一套机制,无论在Canvas上绘制多少图形,Canvas都是一个整体,图形本身实际都是Canvas的一部分,不可单独获取,所以也就无法直接给某个图形增加...

    深入分析javascript中的错误处理机制

    本文将详细介绍javascript中的错误处理机制 error对象  error对象是包含错误信息的对象,是javascript的原生对象。当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个...

    全面了解javascript中的错误处理机制

    本文将详细介绍javascript中的错误处理机制 error对象  error对象是包含错误信息的对象,是javascript的原生对象。当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个...

    Android开发之BroadcastReceiver用法实例分析

    Braodcast Receiver顾名思义就是广播接收器,它和事件处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的。我们可以用Intent来启动一个组件,也可以用...

    libevent v2.0.10源码(跨平台事件触发的网络库)

    libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨...

Global site tag (gtag.js) - Google Analytics