当 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() 。

我认为你的代码有两个小问题:

试试这个(我不确定这是否有效,但可以更多地看到问题):

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

希望能帮到你。