10.2 事件对象
2.Event类的实例属性
Event类的属性包含有关事件的基本信息,例如事件的类型或者是否可以取消事件的默认行为等等。表10-2列出了Event类的实例属性:
表10-2 Event类的属性
属性 | 数据类型 | 含义 |
bubbles | Boolean[read-only] | 指示事件是否为冒泡事件 |
cancelable | Boolean[read-only] | 指示是否忽视事件的默认行为。事件的默认行为是事件发生时,对象自动调用的事件监听器。这种默认行为FlashPlayer自动绑定。例如在输入框中敲击键盘,键盘事件的默认响应行为是显示输入的字符。如果因为特殊的需要,不希望输入框中出现输入的字符,也可以取消默认行为。该属性只能读取,不能直接操作该属性禁止默认行为。通过调用“preventDefault()”方法,可以取消默认行为 |
currentTarget | Object[read-only] | 当前对象 |
eventPhase | uint[read-only] | 事件流中的当前阶段。通过调用“stopPropogation()”或“stopImmediatePropogation()”方法,还可以使当前事件监听器成为要处理事件的最后一个事件监听器 |
target | Object[read-only] | 事件目标 |
type | String[read-only] | 事件的类型 |
对于许多事件(如由Event类常量表示的事件),这些基本信息已经足够。但其他事件可能需要更详细的信息。例如,与鼠标单击关联的事件,需要包括有关单击事件的位置以及在单击事件期间是否按下任何键等信息,可以通过扩展Event类,将这些信息传递给事件监听器。
3.Event类的方法
由于Event类所有的实例属性都只读,所以修改这些属性只能通过Event的构造函数和公共方法。Event类提供的重要实例方法如表10-3所示。
表10-3 Event类方法
方法名称 | 作用 |
clone():Event | 复制Event子类的实例 |
formatToString(className:String, ... arguments):String | 在自定义Event类中实现toString()方法的实用程序函数 |
hasOwnProperty(name:String):Boolean | 指示对象是否已经定义了指定的属性 |
isDefaultPrevented():Boolean | 检查是否已对事件调用preventDefault() |
isPrototypeOf(theClass:Object):Boolean | 指示Object类的实例是否在指定为参数的对象的原型链中 |
preventDefault():void | 如果可以取消事件的默认行为,则取消该行为 |
propertyIsEnumerable(name:String):Boolean | 指示指定的属性是否存在、是否可枚举 |
setPropertyIsEnumerable(name:String, isEnum:Boolean = true):void | 设置循环操作动态属性的可用性 |
stopImmediatePropagation():void | 防止对事件流中当前节点中和所有后续节点中的事件监听器进行处理 |
stopPropagation():void | 防止对事件流中当前节点的后续节点中的所有事件监听器进行处理 |
toString():String | 返回一个字符串,其中包含Event对象的所有属性 |
Event类的方法可以在事件监听器函数中改变事件对象的行为。某些事件有关联的默认行为。例如,doubleClick事件有关联的默认行为,即鼠标左键单击两次。通过调用preventDefault()方法,您的事件监听器可以取消此行为。通过调用stopPropogation()或stopImmediatePropogation()方法,还可以使当前事件监听器成为要处理事件的最后一个事件监听器。
4.Event类的常量
除了实例属性之外,Event类自身还包含一组静态属性。这些静态属性都是公共的常量,可以用作基本事件的类型。例如Event.RESIZE属性,表示改变大小事件的类型。事件类型都是字符串,Event.RESIZE属性的真实值是“resize”。当需要指派事件类型时,可以使用字符串,也可以使用Event类的静态属性,但是建议使用后者。因为这些公共常量可以供编译器进行名称检查,一旦开发者拼写出现错误,编译器将产生编译提示,不能在Event类中找到该成员。如果直接使用字符串,则编译器只判断字符串的数据类型,不会检查字符串的内容。一旦拼写错误,将不会引发编译错误和警告,其后果直到运行时才会出现,事件监听器不能被触发。
10.2.2 扩展Event类
Event类仅能处理有限的消息。对于更具体的应用需求,可能需要更详细的信息。例如,与鼠标单击关联的事件,需要包括有关单击事件的位置,以及在单击事件期间是否按下Shift、Ctrl以及Alt键的信息。将这些具有特殊用途的属性包含到通用的Event类中并不明智。因此,Event类可以作为基类,并通过扩展,实现具体的专项能力。
Event类是一个设计得很出色的类,包含两个特殊的方法:toString()方法和clone()方法。toString()方法返回一个字符串,其中包含Event对象的所有属性,clone()方法将复制事件对象。这两个方法只适用于Event类自身,不能满足子类的需要。如果子类添加了新的属性,则必须修改toString()方法,才能将新的属性输出。同样,clone()方法也不会复制子类中的新属性。因此,Event类的子类都重新定义了这两个方法,以适应自身的情况。为了提供这样的方便,Event类还提供了formatToString()方法,只需在覆盖toString()方法时,调用formatToString()方法,并将所有属性值以参数列出即可。
扩展的Event类依然是事件类,扩展类的对象也可以参与事件响应机制,参与事件流,传递给事件监听器。Flash Player API自身定义了多个Event子类,在Flex中,这些类定义在flash.events包中。当然Flex软件也集成了许多Event子类,定义在mx.events包中。
这些扩展类都包含自身的独特属性。这些属性数量众多,读者不可能也没必要全部掌握。这些扩展类都包含相关消息的静态属性,使用易懂的自然语义描述。在Flash或者Flex的代码编辑器中,只要使用类名称配合代码提示窗口,就能方便的查找每个类的消息类型。
Event类的直系扩展类还会产生自身的扩展类,例如ActivityEvent扩展类拥有一个名为FullScreenEvent的子类,用来处理舞台进入或离开全屏显示模式的事件。
10.3 事件机制的工作流程
事件机制的工作流程,即事件从监听到触发,再到事件处理的过程。熟练掌握事件机制的工作流程将为理解或创建事件发挥重要作用。本节将分别介绍事件机制工作流程中的每一部分。
10.3.1 事件的监听和处理
在事件机制的工作流程中,事件的监听是第一个流程。在设计程序时,首先必须添加对事件的监听,并且指定事件触发后的处理函数。
ActionScript. 3.0中,所有可视化对象已经内建了事件机制,通过类的继承关系,所有的可视化对象都可以使用EventDispatcher类的方法来创建、发送和删除事件监听器。在ActionScript. 3.0中,使用EventDispatcher类的addEventListener()方法可以创建事件监听器,addEventListener()方法的定义如下所示:
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
各参数说明:
l type 事件的类型。
l listener 处理事件的监听器函数。此函数必须接受Event对象作为其惟一的参数,并且不能返回任何结果。
l useCapture 确定监听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将useCapture设置为true,则监听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。如果useCapture为false,则监听器只在目标或冒泡阶段处理事件。
l priority 事件监听器的优先级。优先级由一个带符号的32位整数指定。数字越大,优先级越高。优先级为n的所有监听器会在优先级为n-1的监听器之前得到处理。如果两个或者更多个监听器共享相同的优先级,则按照它们的添加顺序进行处理。默认优先级为0。
l useWeakReference 确定对监听器的引用是强引用,还是弱引用。强引用(默认值)可防止您的监听器被当作垃圾回收。弱引用则没有此作用。
下面创建一个事件监听的具体示例,如代码10.1所示:
代码10.1 创建事件监听器
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initapp()">
<mx:Script>
<



