一、   事件的优先权 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

你可以为一个事件注册多个事件监听器。Flex按照通过addEventListener()方法注册监听器的顺序调。不过,如果你注册了一些行内的监听器,又通过addEventLisntener()方法添加了一些监听器,事件监听器的调用顺序将不可预知。

        

         你可以通过使用addEventListener()方法的priority参数来改变事件监听器的调用顺序。

 

         Flex按照priority参数从高到低的顺序调用监听器。优先级最高的第一个调用。下面的例子中,FlexsaveInputDate()函数前调用verifyInputData()方法,最后一个调用的是returnResult()方法。

 

<?xml version="1.0"?>

<!-- events/ShowEventPriorities.mxml -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()">

<mx:Script><![CDATA[

private function returnResult(e:Event):void {

ta1.text += "returnResult() method called last (priority 1)\n";

}

private function verifyInputData(e:Event):void {

ta1.text += "verifyInputData() method called first (priority 3)\n";

}

private function saveInputData(e:Event):void {

ta1.text += "saveInputData() method called second (priority 2)\n";

}

private function initApp():void {

b1.addEventListener(MouseEvent.CLICK, returnResult, false, 1);

b1.addEventListener(MouseEvent.CLICK, saveInputData, false, 2);

b1.addEventListener(MouseEvent.CLICK, verifyInputData, false, 3);

}

]]></mx:Script>

<mx:Button id="b1" label="Click Me"/>

<mx:TextArea id="ta1" height="200" width="300"/>

</mx:Application>

        

         你可以将优先级设定为任何有效的整数,可以使正数也可以是负数。如果多个监听器拥有相同的优先级,那么它们将按照注册的顺序被调用。

 

         一旦事件监听器被定义,如果你再想改变监听器的优先级,就必须首先调用removeEventListener()方法移除监听器,然后再使用新的优先级添加监听器。

 

         addEventListener()方法的priority参数并不是官方的DOM Level 3事件模型的一部分。

 

         即使你为一个事件监听器设定了一比其他监听器都要高的优先级,也不能保证这个监听器一定会在其他监听器之前被调用。你必须确定在下一个监听器被调用之前,监听器不依赖于其他监听器的完整的执行。了解这一点非常重要,Flash Player没有必要在调用下一个监听器之前等待前一个监听器完成处理。

 

         如果你的监听器依赖于其他的监听器,你可以在一个监听器中调用其它的监听器,或者在第一个事件监听器中调度一个新的事件。

 

二、   使用事件子类

依赖与事件类型,Event对象可以拥有一个范围很大的属性集合。这些属性都基于W3C的说明而定义,但是Flex并没有提供全部的实现。

 

当你在事件监听器函数中定义一个Event对象时,你可以将它定义为Event类型,或者你可以指定一个Event对象的子类。下面的例子中,你指定事件对象的类型为MouseEvent:

 

public function performAction(e:MouseEvent):void {

...

}

 

多数控件都会生成一个特殊的事件类型。指定一个更加特殊的事件类型,你就可以访问特殊的属性,而不需要进行类型转换。此外,一些Event对象的子类型还提供了基础的Event类型所没有的方法。

 

一个在运行时定义的事件对象可以是编译期类型的一个子类。即使你没有定义特殊的事件类型,只要你将Event对象转换为一个特殊的类型,你仍然可以在事件监听器中访问那些事件的特殊属性。在下面的例子中,函数将对象类型定义为Event。不过,在函数中,必须先将Event对象转换为MouseEvent理性,你才能访问localXlocalY属性:

 

<!-- events/AccessEventSpecificProperties.mxml -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">

<mx:Script><![CDATA[

import mx.controls.Alert;

private function customLogEvent(e:Event):void {

var a:MouseEvent = MouseEvent(e);

Alert.show("Y: " + a.localY + "\n" + "X: " + a.localX);

}

private function addListeners():void {

b1.addEventListener(MouseEvent.CLICK, customLogEvent);

}

]]></mx:Script>

<mx:Button id="b1" label="Click Me"/>

</mx:Application>

如果你将Event对象定义为一个特殊的类型,你就不需要在函数中进行类型转换。如下所示:

 

private function customLogEvent(e:MouseEvent):void { ... }

 

在前面的例子中,你也可以只在访问属性时使用下面例子中的语法转换Event对象:

 

<!-- events/SinglePropertyAccess.mxml -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">

<mx:Script><![CDATA[

import mx.controls.Alert;

private function customLogEvent(e:Event):void {

Alert.show("Y: " + MouseEvent(e).localY + "\n" + "X: " + MouseEvent(e).localX);

}

private function addListeners():void {

b1.addEventListener(MouseEvent.CLICK, customLogEvent);

}

]]></mx:Script>

<mx:Button id="b1" label="Click Me"/>

</mx:Application>

        

         这样做虽然将使用更少的内存和系统资源,但是最好还是尽可能的将事件类型定义为特殊的类型。

        

         每个 Event 对象的子类都提供该类型所独有的额外的属性和事件类型。 MouseEvent 类定义了与输入设备有关的几种事件,包括 CLICK,DOUBLE_CLLICK,MOUSE_DOWN MOUSE_UP 事件类型。