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

[AS2]As和js通信问题完全解析(解决addcallback失效的问题)

时间:2012-02-19 13:07baidu
有很多朋友在开发过程中会遇到过下面这些情况,在开发一个js函数上来就调用as的一个函数的时候,页面会报错,提示找不到这个flash对象,或者函数没有定义。Flash8的时代,针对ExternalInterface这个类

  as和js通信最早用的是fscommand,这个我就不说了,老生常谈了,我们这里说的是ExternalInterface这个接口。大家都知道的或者一帮在网上能查到的东西我就不费吐沫了,捡最实在的说。ExternalInterface有两个方法,一个是call,是as调用js,这个没什么说的,我们现在主要说addcallback这个函数,这个函数是as注册一个函数,然后让js通过调用flash这个object对象来调用as注册的这个函数。注意,我这里说的是“js调用flash这个object对象来调用as注册的这个函数",这里我强调了先调用object对象,然后再调用函数,为什么要这么强调呢,因为大家在开发过程中会遇到两个坎,一个是调用flash对象调用不到,一个是调用函数调用不到了。下面我们就针对这两种情况进行详细说明。

  有很多朋友在开发过程中会遇到过下面这些情况,在开发一个js函数上来就调用as的一个函数的时候,页面会报错,提示找不到这个flash对象,或者函数没有定义。Flash8的时代,针对ExternalInterface这个类,文档里只说明了怎么用,而没有具体说怎么合理的组织和页面的结构,一直到了cs3的时代,帮助里才说明了正确的函数注册和js调用的过程,具体的见Flash cs3帮助。大概的代码如下:

js部分:

  1. <script> 
  2. var jsReady=false;  
  3. var swfReady=false;  
  4. function isReady(){  
  5. return jsReady;  
  6. }  
  7. function setSwfIsReady(){  
  8. swfReady=true;  
  9. getSWF("flashobj").fun()  
  10. }  
  11. function pageInit(){  
  12. jsReady=true;  
  13. }  
  14. function getSWF(movieName) {  
  15. if (navigator.appName.indexOf("Microsoft") != -1) {  
  16. return window[movieName+"_ob"];  
  17. } else {  
  18. return document[movieName+"_em"];  
  19. }  
  20. }  
  21. onload=function(){  
  22. pageInit();  
  23. }  
  24. </script> 

  注意,在getSWF函数里我用了 return window[movieName+"_ob"]和return document[movieName+"_em"]
为什么这样用我会在下面说明,一帮的情况下只需要用movieName就可以了

as部分

  1. private function registerJsFun():void{  
  2. if(ExternalInterface.available){  
  3. try{  
  4. var containerReady:Boolean=isContainerReady();  
  5. //ExternalInterface.call("ceshi","registerJsFun:"+containerReady);  
  6. if(containerReady){  
  7. //注册函数  
  8. setupCallBacks();  
  9. }else{  
  10. //检测是否准备好  
  11. var readyTimer:Timer=new Timer(100);  
  12. readyTimer.addEventListener(TimerEvent.TIMER,timeHandler);  
  13. readyTimer.start();  
  14. }  
  15. }catch(error:Error){  
  16. trace(error)  
  17. }  
  18. }else{  
  19. trace("External interface is not available for this container.");  
  20. }  
  21. }  
  22. private function timeHandler(event:TimerEvent):void{  
  23. var isReady:Boolean=isContainerReady();  
  24. if(isReady){  
  25. Timer(event.target).stop();  
  26. setupCallBacks();  
  27. }  
  28. }  
  29. private function isContainerReady():Boolean{  
  30. var result:Boolean=Boolean(ExternalInterface.call("isReady"));  
  31. return result;  
  32. }  
  33. private function setupCallBacks():void{  
  34. ExternalInterface.addCallback("fun",fun);  
  35. ExternalInterface.call("setSwfIsReady");  

热门文章推荐

请稍候...

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

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