所以我有一个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();
}
我错过了什么?
答案 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>