0

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

我想过这样的事情:

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

但这不会起作用,因为它theFunction会尝试做foo(),而它确实应该做swfObject.foo()。问题是页面及其 Javascript 不在我的控制之下(尽管如果真的需要我可以请求更改)。

4

2 回答 2

3

这与相关问题部分的第一个问题密切相关。

与该问题的答案相同,您可以执行以下操作:

ExternalInterface.addCallback("foo", function() { /* ... */ });    // The callback
ExternalInterface.call("theFunction(function() { swfObject.foo(); })");
于 2010-09-28T02:50:16.810 回答
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 端的情况下控制页面,请记住您可以通过注入整段 JS 代码.call——它不需要是一个简单的函数调用。您可以从 SWF 内部创建整个函数。例如,

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

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

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

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

不确定这是否有帮助。如果没有,最好有更多关于你到底想要做什么的信息。

于 2010-09-27T18:53:47.250 回答