事件对象Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 在新的事件处理系统中,事件对象有两个主要用途。首先,事件对象通过将特定事件的有关信息存储在一组属性中来表示实际事件。其次,事件对象包含一组方法,可用于操作事件对象和影响事件处理系统的行为。 为方便对这些属性和方法的访问,Flash Player API 定义了一个 Event 类,作为所有事件对象的基类。Event 类定义所有事件对象共有的一组基本属性和方法。 本部分首先讨论 Event 类属性,然后介绍 Event 类方法,最后说明 Event 类的子类存在的意义。 了解 Event 类的属性Event 类定义许多只读属性和常量,以提供有关事件对象的重要信息。以下内容尤其重要:
事件对象类型每个事件对象都有关联的事件类型。数据类型以字符串值的形式存储在 Event.type 属性中。知道事件对象的类型是非常有用的,这样您的代码就可以区分不同类型的对象。例如,下面的代码指定 clickHandler() 侦听器函数应响应传递给 myDisplayObject 的任何鼠标单击事件对象。 myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler); 大约有 20 多种事件类型与 Event 类自身关联并由 Event 类常量表示,其中某些数据类型显示在摘自 Event 类定义的以下代码中: package flash.events { public class Event { // class constants public static const ACTIVATE:String = "activate"; public static const ADDED:String= "added"; // remaining constants omitted for brevity } } 这些常量提供了引用特定事件类型的简便方法。您应使用这些常量而不是它们所代表的字符串。如果您的代码中拼错了某个常量名称,编译器将捕获到该错误,但如果您改为使用字符串,则编译时可能不会出现拼写错误,这可能导致难以调试的意外行为。例如,添加事件侦听器时,使用以下代码: myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler); 而不是使用: myDisplayObject.addEventListener("click", clickHandler); 默认行为信息代码可通过访问 cancelable 属性来检查是否可以阻止任何给定事件对象的默认行为。cancelable 属性包含一个布尔值,用于指示是否可以阻止默认行为。您可以使用 preventDefault() 方法阻止或取消与少量事件关联的默认行为。有关详细信息,请参阅了解 Event 类的方法下的“取消默认事件行为”。 事件流信息其余 Event 类属性包含有关事件对象及其与事件流的关系的重要信息,如以下列表所述:
bubbles 属性如果事件对象参与事件流的冒泡阶段,则将该事件称为“冒泡”,这指的是从目标节点将事件对象往回传递,经过目标节点的父节点,直到到达舞台。Event.bubbles 属性存储一个布尔值,用于指示事件对象是否参与冒泡阶段。由于冒泡的所有事件还参与捕获和目标阶段,因此这些事件参与事件流的所有三个阶段。如果值为 true,则事件对象参与所有三个阶段。如果值为 false,则事件对象不参与冒泡阶段。 eventPhase 属性您可以通过调查任何事件对象的 eventPhase 属性来确定事件阶段。eventPhase 属性包含一个无符号整数值,该值代表三个事件流阶段中的一个阶段。Flash Player API 定义了单独的 EventPhase 类,该类包含三个对应于三个无符号整数值的常量,如以下摘录代码中所示: package flash.events { public final class EventPhase { public static const CAPTURING_PHASE:uint = 1; public static const AT_TARGET:uint = 2; public static const BUBBLING_PHASE:uint= 3; } } 这些常量对应于 eventPhase 属性的三个有效值。使用这些常量可以使您的代码可读性更好。例如,如果要确保仅当事件目标在目标阶段中时才调用名为 myFunc() 的函数,您可以使用以下代码来测试此条件: if (event.eventPhase == EventPhase.AT_TARGET) { myFunc(); } target 属性target 属性包含对作为事件目标的对象的引用。在某些情况下,这很简单,例如当麦克风变为活动状态时,事件对象的目标是 Microphone 对象。但是,如果目标在显示列表中,就必须考虑显示列表层次。例如,如果用户在包括重叠的显示列表对象的某一点输入一个鼠标单击,则 Flash Player 和 AIR 始终会选择距离舞台层次最深的对象作为事件目标。 对于复杂的 SWF 文件,特别是那些通常使用更小的子对象来修饰按钮的 SWF 文件,target 属性可能并不常用,因为它通常指向按钮的子对象,而不是按钮。在这些情况下,常见的做法是将事件侦听器添加到按钮并使用 currentTarget 属性,因为该属性指向按钮,而 target 属性可能指向按钮的子对象。 了解 Event 类的方法有三种类别的 Event 类方法:
Event 类实用程序方法Event 类中有两个实用程序方法。clone() 方法用于创建事件对象的副本。toString() 方法用于生成事件对象属性的字符串表示形式以及它们的值。这两个方法都由事件模型系统在内部使用,但对开发人员公开以用于一般用途。 对于创建 Event 类的子类的高级开发人员来说,必须覆盖和实现两个实用程序方法的版本,以确保事件子类正常使用。 停止事件流可以调用 Event.stopPropagation() 方法或 Event.stopImmediatePropagation() 方法来阻止在事件流中继续执行事件对象。这两种方法几乎相同,唯一的不同之处在于是否允许执行当前节点的其他事件侦听器:
调用其中任何一个方法对是否发生与事件关联的默认行为没有影响。使用 Event 类的默认行为方法可以阻止默认行为。 取消默认事件行为与取消默认行为有关的两个方法是 preventDefault() 方法和 isDefaultPrevented() 方法。调用 preventDefault() 方法可取消与事件关联的默认行为。若要查看是否已针对事件对象调用了 preventDefault(),请调用 isDefaultPrevented() 方法;如果已经调用,该方法将返回值 true,否则返回值 false。 preventDefault() 方法仅在可以取消事件的默认行为时才起作用。可通过参考该事件类型的 API 文档或使用 ActionScript 检查事件对象的 cancelable 属性来确定是否属于这种情况。 取消默认行为对事件对象通过事件流的进度没有影响。使用 Event 类的事件流方法可以从事件流中删除事件对象。 Event 类的子类对于很多事件,Event 类中定义的一组公共属性已经足够了。但是,Event 类中可用的属性无法捕获其他事件具有的独特的特性。ActionScript 3.0 为这些事件定义了 Event 类的几个子类。 每个子类提供了对该类别的事件唯一的附加属性和事件类型。例如,与鼠标输入相关的事件具有若干独特的特性,无法被 Event 类中定义的属性捕获。MouseEvent 类添加了 10 个属性,扩展了 Event 类。这 10 个属性包含诸如鼠标事件的位置和在鼠标事件过程中是否按下了特定键等信息。 Event 子类还包含代表与子类关联的事件类型的常量。例如,MouseEvent 类定义几种鼠标事件类型的内容,包括 click、doubleClick、mouseDown 和 mouseUp 事件类型。 正如事件对象下的“Event 类实用程序方法”一节所述,创建 Event 子类时,必须覆盖 clone() 和 toString() 方法以实现特定于该子类的功能。 |
|