事件侦听器也称为事件处理函数,是Flash Player为响应特定事件而执行的函数。添加事件侦听器的过程分为两步。首先,为Flash Player创建一个为响应事件而执行的函数或类方法。这有时称为侦听器函数或事件处理函数。然后,使用addEventListener()方法,在事件的目标或位于适当事件流上的任何显示列表对象中注册侦听器函数。
创建侦听器函数是ActionScript3.0事件模型与DOM事件模型不同的一个方面。在DOM事件模型中,事件侦听器和侦听器函数之间有一个明显的不同:即事件侦听器是实现EventListener接口的类的实例,而侦听器是该类的名为handleEvent()的方法。在DOM事件模型中,您注册的是包含侦听器函数的类实例,而不是实际的侦听器函数。
在ActionScript3.0事件模型中,事件侦听器和侦听器函数之间没有区别。ActionScript3.0没有EventListener接口,侦听器函数可以在类外部定义,也可定义为类的一部分。此外,无需将侦听器函数命名为handleEvent()--可以将它们命名为 任何有效的标识符。在ActionScript 3.0中,你注册的是实际侦听器函数的名称。
还有第三种技术可用于创建一个通用对象,该对象具有指向动态分配的侦听器函数的属性,但不推荐使用该技术,原因是this关键字将引用全局对象,而不是你的侦听器对象。
管理事件侦听器
使用IEventDispatcher接口的方法来管理侦听器函数。IEventDispatcher接口是ActionScript3.0版本的DOM事件模型的EventTarget接口。虽然名称IEventDispatcher似乎暗示着其主要用途是发送事件对象,但该类的方法实际上更多用于注册、检查和删除事件侦听器。IEventDispatcher接口定义五个方法,如以下代码中所示:
package flash.events
{
public interface IEventDispatcher
{
function addEventListener(eventName:String,listener:Object,useCapture:Boolean=false,priority:Integer=0,useWeakReference:Boolean=false):Boolean;
function removeEventListener(eventName:String,listener:Object,useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
Flash Player API使用EventDispatcher类来实现IEventDispatcher接口,该类用作可以是事件目标或事件流一部分的所有类的基类。DisplayObject类继承自EventDispatcher类。这意味着,显示列表中的所有对象都可以访问IEventDispatcher接口的方法。
addEventListener()方法是IEventDispatcher接口的主要函数。使用它来注册侦听器函数。两个必需的参数是type和listener。type参数用于指定事件的类型。listener参数用于指定发生事件时将执行的侦听器函数。listener参数可以是对函数或类方法的引用。
通过使用addEventListener()方法的useCapture参数,可以控制侦听器将处于活动状态的事件流阶段。如果useCapture设置为ture,侦听器将在事件流的捕获阶段成为活动状态。如果useCapture设置为false,侦听器将在事件流的目标阶段和冒泡阶段处于活动状态。要在事件流的所有阶段侦听某一事件,你必须调用addEventListener()两次,第一次调用时将useCapture设置为true,第二次调用时将useCapture设置为false.
ActionScript3.0中的priority参数用于设置该事件侦听器的优先级。默认值为0,但你可以将它设置为负整数值或正整数值。将优先执行此数字较大的事件侦听器。对于具有相同优先级的事件侦听器,则按它们的添加顺序执行,因此将优先执行较早添加的侦听器。
可以使用useWeakReference参数来指定对侦听器函数的引用是弱引用还是正常引用。通过将此参数设置为true,可避免侦听器函数在不再需要时仍然存在于内在中的情况。Flash Player使用一项称为“垃圾回收”的技术从内在中清除不再使用的对象。如果不存在对某个对象的引用,则该对象被视为不再使用。垃圾回收器不考虑弱引用,这意味着如果侦听器函数仅具有指向它的弱引用,则符合垃圾回收条件。
removeEventListener()方法用于删除不再需要的事件侦听器。删除将不再使用的所有侦听器是个好办法。必需的参数包括eventName和listener参数。
dispatchEvent()方法将自定义事件对象调度到事件流。该方法唯一接受的参数是对事件对象的引用,此事件对象必须是Event类的实例或子类。调度后,事件对象的target属性将设置为对其调用了dispatchEvent()的对象。
如果在特定显示列表对象上发现特定事件类型的事件侦听器,hasEventListener()方法将返回true。如果发现特定显示列表对象的侦听器,willTrigger()方法也会返回true。但willTrigger()不但检查该显示对象上的侦听器,还会检查该显示列表对象在事件流所有阶段中的所有父级上的侦听器。