所以我有一个Application Sandbox 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(); }
我错过了什么?
好的,我将回答我自己的问题.我保证这不是一个获得更多声望点的策略,但我今天感到非常困惑,但现在已经找到了合适的答案和文档 - 这通常是许多工程师问题的主要问题......
无论如何,答案是:
AIR HTMLLoader对象包含一个魔术属性,HTMLLoader.window
它是JavaScript窗口对象的代理.因此设置HTMLLoader.window = AS3Function;
是一种方式 - 或者与我之前包含的示例有关(假设我设置了一个名为Main的静态属性,它指向Main类):
_html.window.as3Function = Main.as3Function;
现在在JavaScript中,我可以称之为as3Function
:
另一个有趣的属性是JavaScript"window.htmlLoader"对象.它是AS3 HTMLLoader父对象的代理,在我的例子中是_html对象.通过此,您可以从JavaScript访问与_html对象相关的内容.