处理事件

每一个组件在用户与它交互时都会广播事件。例如,当用户单击一个 Button 时,它会调度 MouseEvent.CLICK 事件;当用户选择 List 中的一个项目时,List 会调度 Event. CHANGE 事件。当组件发生重要事情时也会引发事件,例如,当 UILoader 实例完成内容加载时,会生成一个 Event.COMPLETE 事件。若要处理事件,您需要编写在该事件被触发时需要执行的 ActionScript 代码。

组件的事件包括该组件所继承的任何类的事件。这意味着,所有 ActionScript 3.0 用户界面组件都从 UIComponent 类继承事件,因为它是 ActionScript 3.0 用户界面组件的基类。若要查看某一组件广播的事件的列表,请参阅 《用于 Adobe® Flash® Professional CS5 的 ActionScript® 3.0 参考》 中该组件的类条目的“事件”部分。

有关 ActionScript 3.0 中事件处理的完整说明,请参阅 《ActionScript 3.0 编程》

关于事件侦听器

以下要点适用于 ActionScript 3.0 组件的事件处理:

  • 所有事件均由组件类的实例广播。组件实例为“广播器”。

  • 通过调用组件实例的 addEventListener() 方法,可以注册事件的“侦听器”。例如,下面这行代码向 Button 实例 aButton 添加了一个 MouseEvent.CLICK 事件的侦听器:

    aButton.addEventListener(MouseEvent.CLICK, clickHandler);

    addEventListener() 方法的第二个参数注册在该事件发生时要调用的函数的名称,即 clickHandler 。此函数也称作“回调函数”。

  • 您可以向一个组件实例注册多个侦听器。

    aButton.addEventListener(MouseEvent.CLICK, clickHandler1); 
    aButton.addEventListener(MouseEvent.CLICK, clickHandler2);
  • 也可以向多个组件实例注册一个侦听器。

    aButton.addEventListener(MouseEvent.CLICK, clickHandler1); 
    bButton.addEventListener(MouseEvent.CLICK, clickHandler1);
  • 会将一个事件对象传递给该事件处理函数,该对象包含有关该事件类型和广播该事件的实例的信息。有关详细信息,请参阅 关于事件对象

  • 在应用程序终止或您使用 removeEventListener() 显式删除侦听器之前,侦听器会一直保持活动状态。例如,下面这行代码删除 aButton MouseEvent.CLICK 事件的侦听器:

    aButton.removeEventListener(MouseEvent.CLICK, clickHandler);

关于事件对象

事件对象继承自 Event 对象类,它的一些属性包含了有关所发生事件的信息,其中包括提供事件基本信息的 target type 属性:

属性

说明

type

表示事件类型的字符串。

target

对广播事件的组件实例的引用。

如果事件具有其他属性,则会在 《用于 Adobe® Flash® Professional CS5 的 ActionScript® 3.0 参考》 中该事件的类描述中列出。

事件对象是自动生成的,当事件发生时会将它传递给事件处理函数。

您可以在该函数内使用事件对象来访问所广播的事件的名称,或者访问广播该事件的组件的实例名称。您可以从实例名称访问其他组件属性。例如,下面的代码使用 evtObj 事件对象的 target 属性来访问 aButton label 属性并将它显示在“输出”面板中:

import fl.controls.Button; 
import flash.events.MouseEvent; 
 
var aButton:Button = new Button(); 
aButton.label = "Submit"; 
addChild(aButton); 
aButton.addEventListener(MouseEvent.CLICK, clickHandler); 
 
function clickHandler(evtObj:MouseEvent){ 
trace("The " + evtObj.target.label + " button was clicked"); 
}