当AS的ExternalInterface准备就绪时告诉JS

时间:2015-12-17 20:32:10

标签: javascript actionscript-3 flash flex

解决:我应该添加更多细节。即使设置了外部接口,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()。

1 个答案:

答案 0 :(得分:1)

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

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

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

希望可以提供帮助。