【问题标题】:How to invoke an ActionScript method from JavaScript (HTMLLoader) object in AIR?如何从 AIR 中的 JavaScript (HTMLLoader) 对象调用 ActionScript 方法?
【发布时间】:2009-01-15 20:57:17
【问题描述】:

所以我有一个应用程序沙箱 HTMLLoader 对象,我在 AIR 中创建它,并且只想从 JavaScript 调用 ActionScript 方法。在 Flash 中,这是通过我们值得信赖的 ExternalInterface.addCallback() 函数完成的。但是在 AIR 中,情况就大不相同了,我似乎无法让它发挥作用。

这是我的项目的简化概述:

My 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 sn-p,它试图调用在我的 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();
}

我错过了什么?

【问题讨论】:

    标签: actionscript air


    【解决方案1】:

    好的,我将回答我自己的问题。我保证这不是为了获得更多声誉点数,但我今天非常困惑,但现在找到了适当的答案和文档——这通常是许多工程师问题的主要问题......

    不管怎样,答案是:

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

    【讨论】:

    • 您是如何设法将其标记为已接受的答案的?无论如何,谢谢你!我的问题是我需要反过来调用它(AS->JS),但我会在某个地方找到它。
    • AS->JS 可以在这里找到:stackoverflow.com/questions/2285384/… Cheers!
    【解决方案2】:

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

    <script>
      as3Function();
    </script>
    

    【讨论】:

    • JS 就是这样工作的:window 是全局作用域,所以一般你不必显式引用window,例如window.locationlocation 相同,@987654326 @ 等同于new Array() 等。
    猜你喜欢
    • 2012-05-07
    • 2011-12-01
    • 2016-02-11
    • 1970-01-01
    • 2011-10-22
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多