Adobe AIR - 在新创建的窗口上使用EventListener的正确方法是什么?

时间:2009-08-12 21:50:33

标签: javascript jquery scope air event-listener

我是AIR开发的新手,刚刚开始认真构建我的第一个简单的应用程序。我想打开一个新窗口,在第一次运行时提示用户输入所需的设置。在测试新窗口并检测其关闭状态时,我已完成以下操作(包括一些jQuery代码):

以下代码用于在运行主应用程序时打开新窗口(如打开时所示)。

$(document).ready(function(){
    var options = new air.NativeWindowInitOptions();
    options.type = air.NativeWindowType.UTILITY;
    var windowBounds = new air.Rectangle(200,250,300,400);

    //create the new window
    newHTMLLoader = air.HTMLLoader.createRootWindow(true, options, true, windowBounds);
    newHTMLLoader.load(new air.URLRequest("setup.html"));
    newHTMLLoader.window.opener = window;
    newHTMLLoader.window.nativeWindow.addEventListener(air.Event.CLOSE, handleNewSettings);
}

下面的代码直接位于jQuery document.ready函数的右大括号之后。其目的是处理设置窗口的关闭事件。如果它在没有提交的情况下关闭 - 这就是我到目前为止所测试的全部内容 - 我希望它删除事件监听器,如手册所示,以改善内存,并关闭主应用程序窗口(当前不可见)。

function handleNewSettings(event){
    //remove the event handler from memory first...
    newHTMLLoader.removeEventListener(Event.CLOSE, arguments.callee);

    //this is my event handler code
    alert('yay');
    window.close();
}

我在关闭设置窗口后出现了一个似乎是AIR运行时错误的信息:

  

发生了ActionScript错误:   “TypeError:错误#2007:参数   type必须为非null。     在flash.events::EventDispatcher/removeEventListener()“

我认为这个错误与应用程序范围有关,但我也不太了解JS范围规则。如果我注释掉removeEventListener行,它似乎运行代码;但是,我不确定我是否正确地做了所有这些。我试着在我的查询中详细说明,但最初的问题可以追溯到问题的标题。

1 个答案:

答案 0 :(得分:2)

错误是由于缺少类(或者是命名空间?)

newHTMLLoader.removeEventListener(Event.CLOSE, arguments.callee);

......本来应该......

newHTMLLoader.removeEventListener(air.Event.CLOSE, arguments.callee);

我仍然不确定这是否是推荐或正确处理此类事情的方法。