Flex的事件-- 事件的优先权

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

         Flex按照priority参数从高到低的顺序调用监听器。优先级最高的第一个调用。下面的例子中,Flex在saveInputDate()函数前调用verifyInputData()方法,最后一个调用的是returnResult()方法。
Java代码 复制代码  收藏代码
  1. <?xml version="1.0"?>   
  2. <!-- events/ShowEventPriorities.mxml -->   
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()">   
  4. <mx:Script><![CDATA[   
  5. private function returnResult(e:Event):void {   
  6. ta1.text += "returnResult() method called last (priority 1)\n";   
  7. }   
  8. private function verifyInputData(e:Event):void {   
  9. ta1.text += "verifyInputData() method called first (priority 3)\n";   
  10. }   
  11. private function saveInputData(e:Event):void {   
  12. ta1.text += "saveInputData() method called second (priority 2)\n";   
  13. }   
  14. private function initApp():void {   
  15. b1.addEventListener(MouseEvent.CLICK, returnResult, false1);   
  16. b1.addEventListener(MouseEvent.CLICK, saveInputData, false2);   
  17. b1.addEventListener(MouseEvent.CLICK, verifyInputData, false3);   
  18. }   
  19. ]]></mx:Script>   
  20. <mx:Button id="b1" label="Click Me"/>   
  21. <mx:TextArea id="ta1" height="200" width="300"/>   
  22. </mx:Application>  
<?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理性,你才能访问localX和localY属性:

Java代码 复制代码  收藏代码
  1. <!-- events/AccessEventSpecificProperties.mxml -->   
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">   
  3. <mx:Script><![CDATA[   
  4. import mx.controls.Alert;   
  5. private function customLogEvent(e:Event):void {   
  6. var a:MouseEvent = MouseEvent(e);   
  7. Alert.show("Y: " + a.localY + "\n" + "X: " + a.localX);   
  8. }   
  9. private function addListeners():void {   
  10. b1.addEventListener(MouseEvent.CLICK, customLogEvent);   
  11. }   
  12. ]]></mx:Script>   
  13. <mx:Button id="b1" label="Click Me"/>   
  14. </mx:Application>  
<!-- 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对象:
Java代码 复制代码  收藏代码
  1. <!-- events/SinglePropertyAccess.mxml -->   
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="addListeners()">   
  3. <mx:Script><![CDATA[   
  4. import mx.controls.Alert;   
  5. private function customLogEvent(e:Event):void {   
  6. Alert.show("Y: " + MouseEvent(e).localY + "\n" + "X: " + MouseEvent(e).localX);   
  7. }   
  8. private function addListeners():void {   
  9. b1.addEventListener(MouseEvent.CLICK, customLogEvent);   
  10. }   
  11. ]]></mx:Script>   
  12. <mx:Button id="b1" label="Click Me"/>   
  13. </mx:Application>  
<!-- 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事件类型。

http://fykyx521.iteye.com/category/61698?show_full=true

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值