[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未加载完毕导致函数没有注册,希望有类似情况的朋友不妨试一试。
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例