缺省事件处理器是用于在组件内部对某些事件进行缺省动作相应的,这在很多组件里面都是很普遍的,这样组件可以触发某些事件,缺省对该触发的事件进行处理,比如可关闭的窗口中,我们点击顶部X关闭按钮,TitleWindow内部的缺省关闭事件处理器对该事件进行响应,执行关闭当前窗口的操作。这样存在一种情况,有时候我们需要在关闭窗口前先提示用户将要关闭窗口,是否继续等类似的提示,如果用户确认需要关闭,那么就关闭,否则不关闭,对于后面的一种情况,我们需要避免缺省的事件处理器的执行,这样的情况,同样发生在我们自行开发的一些Flex组件中,所以今天我们来说说如何创建一个可被取消的缺省事件处理器。

首先我们要在组件外部自己定义对事件的处理器,而且这个处理器要先于缺省的事件处理器执行,也就是说如果我们在组件内部的事件处理器的优先级要是低于外部的处理器的。对于我们组件外部的事件处理器来说,要有某些方法可以停止缺省的事件处理器的处理,具体的实现有四个步骤:

  1. 在组件内部,触发事件的时候,创建事件要设置该事件为可被取消,也就是要设置事件的cancelable标志为true,对应的是事件构造Event()的第三个参数。
  2. 在组件内部,添加缺省事件监听的处理器时候要使用EventPriority.DEFAULT_HANDLER优先级,由于表示该事件缺省处理器的优先级低于一般的处理器优先级。
  3. 在组件外部,在我们的自定义的事件处理器里面,要使用event.preventDefault()来设置组件内部的缺省事件处理不处理。
  4. 在组件内部,缺省的事件处理器中使用event.isDefaultPrevented()来检测用户时候屏蔽缺省事件处理。

下面是演示代码,在组件的内部,我们定义了一个“alarm”事件,和一个该缺省的事件处理用于声告触发“alarm”事件:

[java]
package
{
import flash.events.Event;
import mx.controls.Alert;
import mx.core.EventPriority;
import mx.core.UIComponent;
[Event( name="alarm", type="flash.events.Event" )]
public class MyComponent extends UIComponent
{
public function MyComponent()
{
// 为"alarm"事件添加缺省事件监听.  这里的关键点为
// 该时间的优先级为:DEFAULT_HANDLER.  这是一个低优先级以使
// 得普通的事件监听可以先执行,使得用户可以通过调用
// event.preventDefault()来取消事件的缺省处理行为。
addEventListener( "alarm", handleAlarm, false, EventPriority.DEFAULT_HANDLER, true );
}
/***
* 一个简单方法,触发一个可被取消带缺省事件处理的事件。
*/
public function triggerAlarm():void
{
// 创建一个新的alarm事件。这里的关键点为构造函数的第三个参数,
// 该参数表示该事件可以通过event.preventDefault()来被取消。
dispatchEvent( new Event( "alarm", false, true ) );
}
/**
* "alarm"事件的缺省处理
*/
protected function handleAlarm( event:Event ):void
{
// 检测该事件是否被其他的事件监听屏蔽了缺省处理行为
if ( !event.isDefaultPrevented() )
{
// 事件没有被取消,所有继续缺省的事件处理
Alert.show( "MyComponent内部Alarm事件缺省处理,handleAlarm" );
}
}
} // end class
} // end package

下面是一个简单的测试代码,我们定义了一个alarm事件的监听,在其内部调用event.preventDefault()来取消该事件的缺省行为执行:

[xml]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:local="*">
<mx:Script>
<![CDATA[
protected function handleAlarm( event:Event ):void
{
// 为了演示意图,我们在界面上有一个标记,
// 用来表示我们是否要屏蔽缺省事件处理的执行
if ( preventToggle.selected )
{
trace( "Default behavior is prevented" );
event.preventDefault();
}
else
{
trace( "We didn't prevent the default behavior, so we'll see the alert from MyComponent." );
}
}
]]>
</mx:Script>
<mx:Button label="触发事件" click="myComp.triggerAlarm();" />
<mx:CheckBox id="preventToggle" label="禁止缺省行为?" selected="true" />
<local:MyComponent id="myComp" alarm="handleAlarm( event );" />
</mx:Application>

查看实例

怎么样很简单吧,这是一个简单但是很有用的技巧,创建可被取消的缺省事件行为是Flex组件开发的一个重要部分,更详细的描述大家可以查看这里

原文:Creating Default, Cancelable Event Handlers