[AS2]As和js通信问题完全解析(解决addcallback失效的问题)
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部分:
- <script>
- var jsReady=false;
- var swfReady=false;
- function isReady(){
- return jsReady;
- }
- function setSwfIsReady(){
- swfReady=true;
- getSWF("flashobj").fun()
- }
- function pageInit(){
- jsReady=true;
- }
- function getSWF(movieName) {
- if (navigator.appName.indexOf("Microsoft") != -1) {
- return window[movieName+"_ob"];
- } else {
- return document[movieName+"_em"];
- }
- }
- onload=function(){
- pageInit();
- }
- </script>
注意,在getSWF函数里我用了 return window[movieName+"_ob"]和return document[movieName+"_em"]
为什么这样用我会在下面说明,一帮的情况下只需要用movieName就可以了
as部分
- private function registerJsFun():void{
- if(ExternalInterface.available){
- try{
- var containerReady:Boolean=isContainerReady();
- //ExternalInterface.call("ceshi","registerJsFun:"+containerReady);
- if(containerReady){
- //注册函数
- setupCallBacks();
- }else{
- //检测是否准备好
- var readyTimer:Timer=new Timer(100);
- readyTimer.addEventListener(TimerEvent.TIMER,timeHandler);
- readyTimer.start();
- }
- }catch(error:Error){
- trace(error)
- }
- }else{
- trace("External interface is not available for this container.");
- }
- }
- private function timeHandler(event:TimerEvent):void{
- var isReady:Boolean=isContainerReady();
- if(isReady){
- Timer(event.target).stop();
- setupCallBacks();
- }
- }
- private function isContainerReady():Boolean{
- var result:Boolean=Boolean(ExternalInterface.call("isReady"));
- return result;
- }
- private function setupCallBacks():void{
- ExternalInterface.addCallback("fun",fun);
- ExternalInterface.call("setSwfIsReady");
- }
热门文章推荐
- [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示例