当 AS 的 ExternalInterface 准备好时告诉 JS
Telling JS when AS's ExternalInterface is ready
已解决:我应该添加更多细节。即使设置了外部接口,NetConnection/NetStream 对象也没有连接到服务器。结果,我无法拨打任何电话。我遗漏了一个非常重要的细节,抱歉。
我知道在外部接口准备就绪时让 Flash 回调 JavaScript 是正确的,所以我进行了调用。 JS 方法被正确调用,但我无法触发对 Flash 文件的成功回调。我必须手动设置 1 秒超时才能使其正常工作,但我不明白为什么。如果外部接口准备好了,那么我应该可以立即回调到 Flash,对吗?
顺便说一下,我正在使用 SWFObject.embedSWF()
将 Flash 文件放在页面上。我已经给文件一个 id 和 name 属性。
这是我的闪存代码:
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() 。
我认为你的代码有两个小问题:
- 第一个问题是使用
call()
method which is used in JavaScript to invoke a function。
试试这个(我不确定这是否有效,但可以更多地看到问题):
swf_obj.call.call();
但解决方案只是使用回调函数的另一个名称:
swf_obj.make_call();
- 第二个是在
ExternalInterface.call()
之后调用 ExternalInterface.addCallback()
,您只需颠倒它们的顺序即可使其正常工作。
因此您的代码可以是这样的,例如:
动作脚本:
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();
}
}
希望能帮到你。
已解决:我应该添加更多细节。即使设置了外部接口,NetConnection/NetStream 对象也没有连接到服务器。结果,我无法拨打任何电话。我遗漏了一个非常重要的细节,抱歉。
我知道在外部接口准备就绪时让 Flash 回调 JavaScript 是正确的,所以我进行了调用。 JS 方法被正确调用,但我无法触发对 Flash 文件的成功回调。我必须手动设置 1 秒超时才能使其正常工作,但我不明白为什么。如果外部接口准备好了,那么我应该可以立即回调到 Flash,对吗?
顺便说一下,我正在使用 SWFObject.embedSWF()
将 Flash 文件放在页面上。我已经给文件一个 id 和 name 属性。
这是我的闪存代码:
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() 。
我认为你的代码有两个小问题:
- 第一个问题是使用
call()
method which is used in JavaScript to invoke a function。
试试这个(我不确定这是否有效,但可以更多地看到问题):
swf_obj.call.call();
但解决方案只是使用回调函数的另一个名称:
swf_obj.make_call();
- 第二个是在
ExternalInterface.call()
之后调用ExternalInterface.addCallback()
,您只需颠倒它们的顺序即可使其正常工作。
因此您的代码可以是这样的,例如:
动作脚本:
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();
}
}
希望能帮到你。