在ExternalInterface中传递回调

时间:2010-09-27 09:46:09

标签: javascript flash actionscript-3 callback externalinterface

我想从Flash调用Javascript函数,我可以使用ExternalInterface,但Javascript函数需要回调。有没有办法给它一个Flash回调?

我想到过这样的事情:

ExternalInterface.addCallback("foo", function(){...});
ExternalInterface.call("theFunction", "foo");

但是,由于theFunction尝试执行foo(),这不会有效,而它应该swfObject.foo()。问题是页面及其Javascript不在我的控制范围内(尽管如果真的需要我可以请求更改)。

2 个答案:

答案 0 :(得分:3)

这与first question in the related questions section密切相关。

与问题的答案一样,你可以这样做:

ExternalInterface.addCallback("foo", function() { /* ... */ });    // The callback
ExternalInterface.call("theFunction(function() { swfObject.foo(); })");

答案 1 :(得分:1)

我认为你误解了这些文档。在这个例子中,callback只是对Flash内部函数的引用,而不是对您调用的函数的回调。

基本上,您使用.call()从AS调用JS函数;并使用.addCallback()告诉Flash Player应根据名称调用哪个AS函数。

在您的示例中,theFunction将获得一个参数为'foo',这是引用您的匿名AS函数的名称。不知道为什么你想要传递这样的功能,但如果你需要,你可以用JavaScript调用它

function theFunction(callback) {
    // .. do something...
    swfObject[callback]();
}

现在,如果您无法控制JS / HTML方面,我不确定您是否可以这样做。不知道为什么你需要,无论如何 - JS调用是同步的,就像它们在同一个线程上运行一样,这意味着Flash Player将执行JS代码,然后才返回Flash Player ......你没有等待执行或任何事情。

另外,如果确实需要在不触及JS / HTML方面的情况下控制页面,请记住您可以通过.call注入整个JS代码 - 它不需要是一个简单的函数调用。您可以从SWF内部创建整个功能。例如,

var js:XML = <script><![CDATA[
    // Javascript code...
]]></script>;
ExternalInterface.call(js);

或者,如果您需要 return 数据,您也不需要回调 - 只需执行简单的调用,如

// JS
function isNumberZero(__num) {
    return __num == 0;
}

// AS
trace ("Is number zero = " + ExternalInterface.call("isNumberZero", 10));

不确定这是否有帮助。如果没有,那么获得有关您正在尝试做什么的更多信息会很好。