AS3: в addEventListener внешняя анонимная функция не работает - PullRequest
2 голосов
/ 26 июня 2009

В основном у меня есть эта функция:

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 вернет функцию с параметром события обратно в функцию 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?

С уважением Z

Ответы [ 2 ]

1 голос
/ 26 июня 2009

это должно работать без проблем ...

вы получаете какие-либо следы, если вы делаете 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");
            }
        }       
    }
}

Не могли бы вы опубликовать / загрузить минимальную настройку, где она не работает?

Greetz

back2dos

0 голосов
/ 26 июня 2009

Одна проблема, которую я сразу вижу, состоит в том, что переменная url существует только тогда, когда функция инициализируется как слушатель, но не когда она запускается через событие мыши. Таким образом, он будет фактически получать нулевое значение при выполнении. (или сгенерируйте ошибку)

Как вы продемонстрировали, слушатель настраивается и работает, как и ожидалось, при возникновении события, поэтому, если ваша кнопка не вызывает событие должным образом, возможно, есть проблема с кнопкой?

...