使 ActionScript 对象可用于 JavaScript

Adobe AIR 1.0 和更高版本

HTMLLoader 对象加载的 HTML 页中的 JavaScript,可以使用 HTML 页的 window.runtimewindow.htmlLoaderwindow.nativeWindow 属性来调用 ActionScript 执行上下文中定义的类、对象和函数。还可以通过在 JavaScript 执行上下文中创建对 ActionScript 对象和函数的引用,从而使其可用于 JavaScript。

从 ActionScript 访问 JavaScript 对象的基本示例

以下示例说明如何添加相关属性,将 ActionScript 对象引用到 HTML 页的全局 window 对象:

var html:HTMLLoader = new HTMLLoader(); 
var foo:String = "Hello from container SWF."  
function helloFromJS(message:String):void { 
    trace("JavaScript says:", message); 
} 
var urlReq:URLRequest = new URLRequest("test.html"); 
html.addEventListener(Event.COMPLETE, loaded); 
html.load(urlReq); 
 
function loaded(e:Event):void{ 
    html.window.foo = foo; 
    html.window.helloFromJS = helloFromJS; 
}

上例中加载到 HTMLLoader 对象的 HTML 内容(位于名为 test.html 的文件中),可以访问父级 SWF 文件中定义的 foo 属性和 helloFromJS() 方法:

<html> 
    <script> 
        function alertFoo() { 
            alert(foo);  
        } 
    </script> 
    <body> 
        <button onClick="alertFoo()"> 
            What is foo? 
        </button> 
        <p><button onClick="helloFromJS('Hi.')"> 
            Call helloFromJS() function. 
        </button></p> 
    </body> 
</html>

访问加载文档的 JavaScript 上下文时,可以使用 htmlDOMInitialize 事件按照适当的页面构造顺序尽早创建对象,以便页面中定义的所有脚本均能访问这些对象。如果等待 complete 事件,则只有在页面 load 事件之后运行的页面中的脚本才能访问所添加的对象。

使类定义可用于 JavaScript

若要使应用程序的 ActionScript 类可用于 JavaScript,可以将加载的 HTML 内容分配给包含类定义的应用程序域。JavaScript 执行上下文的应用程序域可以通过 HTMLLoader 对象的 runtimeApplicationDomain 属性进行设置。若要将应用程序域设置为主应用程序域,例如将 runtimeApplicationDomain 设置为 ApplicationDomain.currentDomain,则按以下代码所示:

html.runtimeApplicationDomain = ApplicationDomain.currentDomain;

一旦设置了 runtimeApplicationDomain 属性,JavaScript 上下文将与所分配的域共享类定义。若要在 JavaScript 中创建自定义类的实例,需通过 window.runtime 属性引用类定义并使用 new 运算符:

var customClassObject = new window.runtime.CustomClass();

HTML 内容必须来自兼容的安全域。如果 HTML 内容来自所分配的应用程序域之外的其他安全域,则页面将改为使用默认的应用程序域。例如,如果从 Internet 加载远程页面,则不能将 ApplicationDomain.currentDomain 分配为该页面的应用程序域。

删除事件侦听器

在将 JavaScript 事件侦听器添加到当前页面外部的对象时(包括运行时对象、加载的 SWF 内容中的对象,甚至是其他页面中运行的 JavaScript 对象),则均应在页面卸载时删除这些事件侦听器。否则,事件侦听器会将事件调度给不再存在的处理函数。如果出现这种情况,将会看到以下错误消息:“The application attempted to reference a JavaScript object in an HTML page that is no longer loaded”(应用程序尝试引用已不再加载的 HTML 页中的 JavaScript 对象)。删除不必要的事件侦听器还能使 AIR 回收关联的内存。有关详细信息,请参阅删除执行导航的 HTML 页面中的事件侦听器