如何从AIR中的JavaScript(HTMLLoader)对象调用ActionScript方法?

时间:2009-01-15 20:57:17

标签: actionscript air

所以我有一个Application Sandbox HTMLLoader对象,我在AIR创建,只想从ActionScript调用JavaScript方法。在Flash中,这是通过我们可靠的 ExternalInterface.addCallback()函数完成的。然而在AIR中,事情有点不同,我似乎无法让它发挥作用。

以下是我项目的简要概述:

我的AIR(ActionScript)主:

public class Main extends Sprite {

    public var _as3Var:String = "testing";
    public function as3Function():void
    {
        trace("as3Function called from Javascript");
    }

    public function Main() {
        NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);
    }

    protected function onInvoke(e:InvokeEvent):void {
        NativeApplication.nativeApplication.removeEventListener(InvokeEvent.INVOKE, onInvoke );
        var app = new App();
        addChild(app);
        app.init(new ExternalContainer(), e.currentDirectory, e.arguments);
    }
}

这就是我创建HTMLLoader对象的方式:

{
    _html = new HTMLLoader();
    _html.useCache = false;
    _html.runtimeApplicationDomain = ApplicationDomain.currentDomain;
    _html.load(new URLRequest("sandbox/AirRoot.html"));
    _html.width = 800;
    _html.height = 600;
    App.ref.addChild(_html);
}

最后,这是我的 AirRoot.html 文件中的JavaScript代码段,它试图调用我的Main类中声明的公共方法 as3Function()

Exposed.testAs3 = function()
{
    air.trace("Exposed.testAs3 called");            /* This works fine. */
    air.trace("runtimeVersion:");                   /* This works fine. */
    air.trace(air.NativeApplication.nativeApplication.runtimeVersion);  /* This works fine. */
    air.trace("seeing if I can get to AS3 params...");  /* This works fine. */

    /* This doesn't work - get the following error: TypeError: Value undefined does not allow function calls. */
    air.NativeApplication.nativeApplication.as3Function();
}

我错过了什么?

2 个答案:

答案 0 :(得分:6)

好的,我将回答我自己的问题。我保证这不是一个获得更多声望点的策略,但我今天感到非常困惑,但现在已经找到了合适的答案和文档 - 这通常是许多工程师问题的主要问题......

无论如何,答案是:

AIR HTMLLoader对象包含一个魔术属性HTMLLoader.window,它是JavaScript窗口对象的代理。因此设置HTMLLoader.window = AS3Function;是一种方式 - 或者与我之前包含的示例有关(假设我设置了一个名为Main的静态属性,它指向Main类):

_html.window.as3Function = Main.as3Function;

现在在JavaScript中,我可以将as3Function称为:

<script>
    window.as3Function();
</script>

另一个有趣的属性是JavaScript“window.htmlLoader”对象。它是AS3 HTMLLoader父对象的代理,在我的例子中是_html对象。通过这种方式,您可以从JavaScript访问与_html对象相关的内容。

答案 1 :(得分:1)

我不确定这是否是新版AIR的更改,但您不再需要在javascript调用中引用该窗口,您可以这样做:

<script>
  as3Function();
</script>