解决:我应该添加更多细节。即使设置了外部接口,NetConnection / NetStream对象也未连接到服务器。结果,我无法拨打任何电话。我遗漏了一个非常重要的细节,道歉。
我知道当外部接口准备就绪时让Flash回调JavaScript是合适的,所以我打电话。 JS方法被正确调用,但我无法触发成功回调Flash文件。我必须手动设置1秒超时才能使其工作,我不明白为什么。如果外部接口准备就绪,那么我应该能够马上回电话,对吗?
顺便说一句,我正在使用SWFObject.embedSWF()
将Flash文件放在页面上。我给了文件一个id和name属性。
这是我的flash代码:
private function init():void // onCreationComplete handler
{
this.setupExternalInterface();
}
private function setupExternalInterface():void
{
if (ExternalInterface.available)
{
ExternalInterface.call("swfIsReady");
ExternalInterface.addCallback("call", makeACall);
}
}
这是JSP页面:
function swfIsReady(){
setTimeout(flexCall,1000);
}
function flexCall(){
var theApp = getFlexApp(attributes.name);
theApp.call();
}
function getFlexApp(appName)
{
if (navigator.appName.indexOf ("Microsoft") !=-1)
{
return window[appName];
}
else
{
return document[appName];
}
}
这是它的唯一工作方式。我以为我可以删除超时并直接调用flexCall()。
答案 0 :(得分:1)
我认为你的代码中有两个小问题:
call()
中使用的invoke a function方法。 试试这个(我不确定它是否有效,但更多地看到问题):
swf_obj.call.call();
但解决方案只是使用你的回调函数的另一个名称:
swf_obj.make_call();
ExternalInterface.addCallback()
之后调用ExternalInterface.call()
,您可以按顺序对其进行调整以使其正常工作。所以你的代码就像这样:
ActionScript:
private function init(event:FlexEvent):void
{
setupExternalInterface();
}
private function setupExternalInterface():void
{
if (ExternalInterface.available)
{
ExternalInterface.addCallback("make_call", makeACall);
ExternalInterface.call("swfIsReady");
}
}
JavaScript:
function swfIsReady()
{
var swf_obj= swfobject.getObjectById(attributes.name);
if (swf_obj) {
swf_obj.make_call();
}
}
希望可以提供帮助。