·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]ExternalInterface.addCallback参数交互用法说明

时间:2017-05-08 09:52酷播
[AS3]ExternalInterface.addCallback参数交互用法说明

在AS3编程中,如果我们要JavaScript来调用AS3中的函数,常用的方法就是使用ExternalInterface类中的addCallback方法。该方法官方解释如下:将ActionScript 方法注册为可从容器调用。成功调用addCallBack() 后,容器中的JavaScript 或ActiveX 代码可以调用在Flash Player 中注册的函数。

在AS3中,该方法的原始定义如下

public static function addCallback(functionName:String, closure:Function):void

他有2个参数,第一个参数指的是AS3中需要调用的函数名,第二个参数则是JS中调用的函数名,我们看AS3中关于这个函数的使用帮助中有如下说明:

在包含SWF 文件的HTML 页中,在该文件的object 标签中设置以下参数:

<param name="allowScriptAccess" value="always" />

在SWF 文件中,添加以下ActionScript:

flash.system.Security.allowDomain(sourceDomain )

 这2个说明其实是为了解决安全沙箱的问题,但是实际使用中,我们常常还会遇到更加头疼的问题。

比如AS3中有个函数叫showMC(mc:MovieClip):void;

我们使用ExternalInterface.addCallback("showMC" , jsshowMC) ;

来注册一个外部接口函数,ok,我们同样设置allowScriptAccess为always和allowDomain(*),但是JS经常还是会报错:jsshowMC is not a Function,这是为什么呢?进过多次试验,原来才发现,AS3中,如果需要使用addCallback函数来注册外部函数接口,那么必须是当前的swf完全加载完毕才能注册成功,如果还在当前swf加载的过程中就在JS中调用的话肯定会因为找不到函数而报错。

        解决办法有几个,一个是swf尽可能的小,提高加载速度,当然这个指标不治本,那么,我们可以在JS中来判断所调用的函数是否有效,如果所调用的函数未定义,那么我们就等待,比如我们可以用一个Timer:setTimeout("checkFuncName()",100);每隔100毫秒来调用checkFuncName检测函数是否有效,checkFuncName里我们可以写检测函数是否是undefined,如果是就继续循环。

        这个问题曾经困扰了我1个小时,刚开始一直以为是安全沙箱的限制,最后才发现是因为swf未加载完毕导致函数没有注册,希望有类似情况的朋友不妨试一试。

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器