`
hereson
  • 浏览: 1454007 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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”); } 具体我就不解释了,不明白的同学可以仔细去看下cs3帮助,大概的意思就是页面开始渲染的时候js去调用swf对象,有可能swf对象没有完全load完,所以这个触发器要从flash开始,当flash加载的时候就开始不停的调用页面的一个函数,取一个页面是否加载完毕的标识,当pageonLoad后,这个标识为true了,说明flash也加载完毕了,这个时候flash再开始注册函数,同时调用页面的js,让js调用Flash对象,感觉绕了一大圈,但这是官方推荐的方法。在flash8的时候,我不知道这么用,采用了一种比较笨的办法,就是setTimeout执行addCallback来注册as函数,大家可能要问为什么这么麻烦。我再后面会说明。 好了,现在我举两个最实际的例子,在我开发搜狗音乐盒的时候,因为播放音乐的工作完全交给mediaPlayer这个微软的Object。然后又要在flash里实时的显示歌曲的进度,音量等信息,不得不频繁的在as和js之间不停的调用,那段时间简直痛不欲生。而且mediaPlayer这个对象还有好多版本的内核,从6.4到11,当时我了解了不少这方面的信息,如果有同学对这个感兴趣,可以写mail给我。扯远了,继续说我们这个问题,当时产品上线的时候,在我本机的resin上测试,没有任何的问题,但是一上真实的生产环境,就出问题了,什么问题呢,IE和ff下是没有问题的,问题处在tt(就是腾讯那个浏览器)和遨游浏览器上,清掉浏览器的cache,没有问题,第2次刷新的时候,产生脚本错误,调用as函数失效。而在我本机怎么测都没有问题,后来发现原来是我本机没有设置resin的cache,既没有过期头。为什么一有cache as注册的函数就失效呢,这也是为什么cs3的时候出了一套规范的流程来规定如何使用addCallback,因为flash一旦在浏览器里cache住,如果在as里一开始就addcallback就会失效,至于为什么我到现在也说不清楚,解决的办法就是用官方的办法,如上的代码或者用我当时的笨办法 setTimeOut(registerFun,50) registerfun就是实现addCallBack的函数,这样就能避免TT和遨游浏览器下如果cache住的时候,addcallback失效的问题。 还有一个办法我没有尝试,就是如果你是 用Flash开发,把displayObject放在第一帧,而addCallback放到第二帧上,为什么这么做呢,这是我从Flex那得到的灵感,在Flex下,这样写,在Application里写 creationComplete=initApp();然后在initApp里addCallback 多说一句,Flex程序是分成两帧,第一帧是preload,第二帧才开始渲染界面,然后在Application下有三种状态preinitialize,initialize,creationComplete,这三个的意思分别就是在初始化前,初始化,和界面完全渲染完毕 那么如果你在界面完全渲染完毕的时候addCallback,才能保证有效。 现在我来解释为什么之前我用的return window[movieName+”_ob”]和return document[movieName+”_em”],在IE下,如果object标签和embed表现用同样的id,通过js去访问flash对象的时候,IE会认不出,FF是没有问题的,至于为什么我不知道,所以,我当初在搜狐做视频播放器的时候采用这样的方式 然后你就知道我前面为什么那么写了,所以,劝解大家一句,尽量不要用那个swfObejct.js这个东西,as和js交互起来很麻烦。你可以自己写一个简单的insertFlash.js function insertFlash(elm, url, w, h) { if (!document.getElementById(elm)) return; var str = ”; str += ‘’; str += ‘’; str += ‘’; str += ‘’; str += ‘’; str += ‘’; str += ‘’; document.getElementById(elm).innerHTML = str; } 至于版本的判断和版本的升级,大家去Adobe官方网站去下检测包吧。我就不多废话了,不过上次我用了半天,检测版本号一直不对,检测是否安装倒是可以 好了,先就写这些了,希望对同学们有所帮助 来自:http://www.zhaohongri.cn
分享到:
评论
1 楼 peijunlin2008 2010-03-02  
排版来练眼力了!

相关推荐

    AS3与JS通信

    AS3(ActionScript 3)和JavaScript之间的通信是Web开发中的一个重要话题,特别是在构建富互联网应用程序(RIA)时。ActionScript 3是Adobe Flash Player和Adobe AIR中的编程语言,而JavaScript则是网页开发的标准...

    FLASH与JS双向通信AS2

    本主题聚焦于"FLASH与JS双向通信AS2.0",即ActionScript 2.0版本的Flash与JavaScript之间的数据交换。 ActionScript是Adobe Flash Player支持的编程语言,主要用于创建互动性的内容,如动画、游戏和应用程序。AS2.0...

    FLASH CS3(AS3)和JS之间通信

    标题“FLASH CS3(AS3)与JS之间通信”涉及的是两种主要的Web技术——Adobe Flash(使用ActionScript 3,简称AS3)和JavaScript之间的交互。这两种技术在Web开发中各自发挥着重要作用,Flash主要用于动画和多媒体内容...

    AS3.0与JS交互

    - 需要处理跨域安全问题,如果AS3.0内容和JavaScript在不同的源下,需要配置跨域策略文件。 4. **实际应用**: 这种交互机制在许多场景下都很实用,例如: - 动态数据交换:如实时更新Flash中的图表或动画数据。...

    js与as通信,js调用flash的方法

    在JavaScript (JS) 和ActionScript (AS) 之间进行通信是一种常见的需求,特别是在网页中集成Flash内容时。本文将深入探讨如何实现JS与AS的交互,以及如何通过JS调用Flash中的方法。我们将通过几个关键知识点来理解这...

    as3 与js相互通信

    3. **调试**:AS3与JS通信时的错误通常难以定位,使用`trace`语句进行日志记录或使用Flash的调试版本可以帮助解决问题。 总结来说,AS3与JS的相互通信是Web开发中增强互动性和功能的重要手段,尽管随着HTML5和WebGL...

    C#winform与as通信

    在IT行业中,C# WinForm和AS(ActionScript)之间的通信是跨平台应用程序开发中的一个常见需求。ActionScript主要用于Adobe Flash开发,而C# WinForm则是.NET Framework下的桌面应用程序开发框架。将这两者结合,...

    as2/3与js相互调用实例 源码

    AS2(ActionScript 2.0)和AS3(ActionScript 3.0)是Adobe Flash中的两种脚本语言,而JavaScript(JS)是Web开发中的主要脚本语言。这三者之间的相互调用在创建富互联网应用程序(RIA)时非常常见,特别是在需要...

    js与as相互调用

    JavaScript(JS)与ActionScript(AS)是两种不同的脚本语言,它们在Web开发和富互联网应用程序(RIA)中都发挥着重要作用。JS主要用于浏览器端的交互和动态效果,而AS主要与Adobe Flash平台相关,用于创建动画和...

    Flash AS3与JAVASCRIPT通信,读取图片,生成SWC

    - **Bridge技术**:AS3和JavaScript之间的通信主要通过Flash Player的`ExternalInterface`类实现。`ExternalInterface.addCallback`方法用于在AS3中注册一个函数,使得JavaScript可以调用它;反之,JavaScript可以...

    Flash与JavaScript的通信例子及总结(源码)

    Flash和JavaScript之间的通信主要基于两种技术:External Interface和Bridge技术。External Interface是AS3(ActionScript 3)中内置的功能,允许Flash内容与宿主环境(通常是网页)中的JavaScript进行双向通信。...

    AS3与JS交互通信(使用swfObject插入Flash)

    4、使用Flash中的ExternalInterface.addCallback方法创建接口,使JS能够调用AS中的函数。 包含swfobject.js与fla源文件。 (*下载swfObject开发版及示例请访问:http://code.google.com/p/swfobject/) 兼容性,...

    js调用AS flash函数

    在现代Web开发中,JavaScript(JS)和Adobe Flash(AS,ActionScript)是两种常见的交互技术,它们在创建动态和富媒体内容时起着重要作用。虽然Flash已经逐渐被HTML5取代,但在某些特定场景下,如旧版浏览器的兼容性...

    flex 与 js 通信的小例子

    本篇文章将探讨一个关于“flex与js通信”的小例子,它主要涉及到Adobe Flex和JavaScript之间的交互,这对于创建富互联网应用程序(RIA)是非常重要的。Flex是一种用于构建富客户端应用的开源框架,基于ActionScript...

    js调用as函数百分百能使用

    JavaScript(简称JS)和ActionScript(AS)是两种不同的脚本语言,它们分别在Web开发的不同领域中发挥作用。JS主要用于浏览器端,实现客户端交互和动态网页效果,而AS主要与Adobe Flash相关,用于创建富媒体内容和...

    VC2005和Flash AS3通信

    在AS3中,我们可以创建一个全局的ExternalInterface,该接口允许AS3代码与JavaScript或宿主环境(如VC++)进行通信。在AS3代码中,我们需要声明要暴露给外部调用的函数,例如: ```actionscript import flash....

    在网页中用AS调用JS播放WMA音乐

    通过这种方式,我们可以利用AS和JavaScript的组合,在网页中实现WMA音乐的播放。需要注意的是,由于WMA的浏览器兼容性和Flash的逐渐淘汰,这种方法可能在现代Web环境中效果不佳。为了提供更好的用户体验,建议转换...

    一个flash和javascript通信的例子

    标题 "一个Flash和JavaScript通信的例子" 涉及的核心技术是Flash与JavaScript之间的交互,也称为Flash External Interface(简称FEI)或者ActionScript JavaScript Bridge(AS3 JSBridge)。这种技术允许网页中的...

    AS3获取JS回传值

    在跨平台的Web开发中,AS3(ActionScript 3.0)与JavaScript的交互是一项重要的技术,尤其在处理Flash内容时。本教程将详细解释如何实现AS3获取JavaScript回传的值,并将这些值显示在Flash的文本框中。由于这种交互...

    JS与Flex通信、互转例子

    在IT行业中,JavaScript(JS)和Flex是两种广泛使用的前端技术。JS主要应用于浏览器端,负责处理用户交互和动态更新页面,而Flex是基于ActionScript 3(AS3)的开发框架,主要用于创建富互联网应用程序(RIA)。在...

Global site tag (gtag.js) - Google Analytics