3

所以我有一个应用程序沙箱 HTMLLoader 对象,我在AIR中创建它,只是想从JavaScript调用ActionScript方法。在 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();
}

我错过了什么?

4

2 回答 2

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 对象相关的内容。

于 2009-01-16T04:35:13.773 回答
1

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

<script>
  as3Function();
</script>
于 2010-10-28T21:45:10.607 回答