AS3:在addEventListener中,外部匿名函数未运行

时间:2009-06-26 13:45:58

标签: actionscript-3 functional-programming event-handling anonymous-function

基本上我有这个功能:

private function clickURL(url:String):Function{
    trace("Function has been instantiated");
    return function(event:MouseEvent):void{
        trace("Function has been run");
        ExternalNavigation.newBrowserWindow(url);
    }
}

这个函数的目的是获取一个url,将url放在另一个函数中并将该函数传回去,这样我就可以输入:

urlButton.addEventListener(MouseEvent.CLICK, clickURL("http://test.com"));

函数clickURL会将带有event参数的函数返回给addEventListener函数。以这种方式,我指定按下按钮时将打开的URL。

以下是使用它时会发生什么的输出:

//Function has been instantiated

单击按钮时,internatl函数永远不会运行。所以我想我会用假事件试一试,以确保我没有错过任何东西。

var clickTest:Function = clickURL("http://stackoverflow.com");
clickTest(new MouseEvent(MouseEvent.CLICK));

这是输出:

//Function has been instantiated
//Function has been run

如您所见,两个函数都已运行。有没有人知道为什么这是有效的而不是addEventListener?

此致 ž

2 个答案:

答案 0 :(得分:1)

这应该没有问题......

如果你urlButton.addEventListener(MouseEvent.CLICK, trace);并点击按钮,你会得到任何痕迹吗?

编辑:

我真的无法重现它......这里有一些完美无缺的代码:

package {
    import flash.display.*;
    import flash.events.*;
    public class Main extends Sprite {
        private var urlButton:Sprite;
        public function Main():void {
            this.addChild(this.urlButton = new Sprite());
            this.urlButton.graphics.beginFill(0xFF00FF);
            this.urlButton.graphics.drawRect(0, 0, 200, 50);
            urlButton.buttonMode = true;
            urlButton.addEventListener(MouseEvent.CLICK, clickURL("http://test.com"));
        }
        private function clickURL(url:String):Function{
            trace("Function has been instantiated");
            return function(event:MouseEvent):void{
                trace("Function has been run");
            }
        }       
    }
}

你可以发布/上传一个最小的设置,它不起作用吗?

格尔茨

back2dos

答案 1 :(得分:-1)

我立即看到的一个问题是变量url仅在函数初始化为侦听器时存在,而不是在通过鼠标事件触发时存在。所以它实际上会在执行时收到一个空值。 (或抛出错误)

正如您所演示的那样,当事件被触发时,侦听器会按预期设置并执行,因此如果您的按钮没有正确触发事件,那么按钮可能存在问题?