Javascript 在外部接口中传递回调

Javascript 在外部接口中传递回调,javascript,flash,actionscript-3,callback,externalinterface,Javascript,Flash,Actionscript 3,Callback,Externalinterface,我想从Flash调用一个Javascript函数,我可以使用ExternalInterface,但是Javascript函数需要回调。有没有办法给它一个快速回调 我想到过这样的事情: ExternalInterface.addCallback("foo", function(){...}); ExternalInterface.call("theFunction", "foo"); 但这不起作用,因为函数将尝试执行foo(),而实际上它应该执行swfObject.foo()。问题是页面和它的J

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

我想到过这样的事情:

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

但这不起作用,因为函数将尝试执行
foo()
,而实际上它应该执行
swfObject.foo()
。问题是页面和它的Javascript不在我的控制之下(尽管如果真的需要,我可以请求更改)。

我认为您误解了文档<代码>回调在本例中,它只是对Flash内部函数的引用,而不是对您调用的某个函数的回调

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

在您的示例中,
theFunction
将获得一个参数作为'foo',这是引用匿名as函数的名称。不确定为什么要这样传递函数,但如果需要,可以使用

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);

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

我认为你误解了文档<代码>回调在本例中,它只是对Flash内部函数的引用,而不是对您调用的某个函数的回调

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

在您的示例中,
theFunction
将获得一个参数作为'foo',这是引用匿名as函数的名称。不确定为什么要这样传递函数,但如果需要,可以使用

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);

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

这与问题密切相关

按照与该问题答案相同的思路,您可以:

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

这与环境密切相关

按照与该问题答案相同的思路,您可以:

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

谢谢,但我确实理解ExternalInterface的工作原理(除了可以在页面中插入新的Javascript之外,这是新的信息)。我试图滥用addCallback来进行实际的回调,我确实需要这样做,因为Javascript函数将执行异步internet请求。无论如何,我们现在可以控制HTML/JS端了。谢谢,但我确实理解ExternalInterface的工作原理(好吧,除了可以在页面中插入新的Javascript,这是新的信息)。我试图滥用addCallback来进行实际的回调,我确实需要这样做,因为Javascript函数将执行异步internet请求。无论如何,我们现在可以控制HTML/JS端了。