WEB开发网
开发学院图形图像Flash AS3编程中ExternalInterface.addCallback的使用 阅读

AS3编程中ExternalInterface.addCallback的使用

 2012-02-06 12:14:58 来源:本站整理   
核心提示:在AS3编程中,如果我们要JavaScript来调用AS3中的函数,AS3编程中ExternalInterface.addCallback的使用,常用的方法就是使用ExternalInterface类中的addCallback方法,该方法官方解释如下:将 ActionScript 方法注册为可从容器调用,刚开始一直以为

在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未加载完毕导致函数没有注册,希望有类似情况的朋友不妨试一试。

Tags:AS 编程 ExternalInterface

编辑录入:coldstar [复制链接] [打 印]
赞助商链接