学习 Flash 中的 ActionScript 2.0 |
|
|
|
| 处理事件 > 使用 Delegate 类 | |||
Delegate 类允许您在特定作用域内运行函数。提供了这个类之后,您就可以将同一个事件调度给两个不同的函数(请参见"使用组件"中的将事件委托给函数),并可以在包含类的作用域内调用函数。
当将一个函数作为参数传递给 EventDispatcher.addEventListener() 时,会在广播器组件实例的作用域内调用该函数,而不是在声明该函数的对象的作用域内调用(请参见"使用组件"中的委托函数的范围)。您可以使用 Delegate.create() 在声明对象的作用域内调用函数。
以下示例演示了侦听 Button 组件实例的事件的三种方法。使用不同的方法向 Button 组件实例添加事件侦听器,会使事件在不同作用域内调度。
使用 Delegate 类侦听事件: 在以后的步骤中,使用 ActionScript 将该按钮实例添加或放置在舞台上。
import mx.controls.Button;
import mx.utils.Delegate;
function clickHandler(eventObj:Object):Void {
trace("[" + eventObj.type + "] event on " + eventObj.target + " instance.");
trace("\t this -> " + this);
}
var buttonListener:Object = new Object();
buttonListener.click = function(eventObj:Object):Void {
trace("[" + eventObj.type + "] event on " + eventObj.target + " instance.");
trace("\t this -> " + this);
};
this.createClassObject(Button, "one_button", 10, {label:"One"});
one_button.move(10, 10);
one_button.addEventListener("click", clickHandler);
this.createClassObject(Button, "two_button", 20, {label:"Two"});
two_button.move(120, 10);
two_button.addEventListener("click", buttonListener);
this.createClassObject(Button, "three_button", 30, {label:"Three"});
three_button.move(230, 10);
three_button.addEventListener("click", Delegate.create(this, clickHandler));
前面的代码分为六个部分(各部分之间用空行分隔)。第一部分导入 Button 类(针对 Button 组件)和 Delegate 类。代码的第二部分定义用户单击某些按钮时调用的函数。代码的第三部分创建用作事件侦听器的对象,该对象侦听单个 click 事件。
代码剩下的三部分可单独在舞台上创建一个新的 Button 组件实例,重新放置实例,以及添加 click 事件的事件侦听器。第一个按钮添加 click 事件的事件侦听器,并直接传递对 click 处理函数的引用。第二个按钮添加 click 事件的事件侦听器,并传递对包含 click 事件的处理函数的侦听器对象的引用。最后,第三个函数添加 click 事件的事件侦听器,使用 Delegate 类在 this 作用域内调度 click 事件(其中 this 等于 _level0),并传递对 click 处理函数的引用。
[click] event on _level0.one_button instance.
this -> _level0.one_button
单击 one_button 实例时,this 作用域引用该按钮实例本身。
[click] event on _level0.two_button instance.
this -> [object Object]
单击 two_button 实例时,this 作用域引用 buttonListener 对象。
[click] event on _level0.three_button instance.
this -> _level0
单击 three_button 实例时,this 作用域引用在 Delegate.create() 方法调用中指定的作用域,在这个示例中为 _level0。
|
|
|
|