首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Flash >

javascript小结(三)js与FLASH的交互

2012-10-25 
javascript总结(三)js与FLASH的交互目录(一)有关框架(二)文件组织与代码组织(三)JS与FLASH交互(四)ajax局

javascript总结(三)js与FLASH的交互

目录
(一)有关框架
(二)文件组织与代码组织
(三)JS与FLASH交互
(四)ajax局部刷新与RPC
  (五)获取设置元素样式与监听元素事件
  (六)页面元素的创建调整与关联
(七)浏览器兼容性问题
(八)WEB软件的前端架构实践

文章中的代码只为表达文章意义,非真正能执行的代码。
JS与FLASH交互
与flash交互遇到的问题
一、由于嵌入标记以及浏览器等原因,导致JS无法调用FLASH中的方法
使用swfobject来嵌入你的FLASH
它的优点有:
简单简洁,再也不那COPY那一大段的标记了支持指定FLASH版本,如果版本不够可自动升级
二、FLASH调用JS的时候,JS对象还不存在
由于大部分脚本是放到页面最底部的(这样做的原因是让浏览器先渲染出界面,因为载入脚本时会停止渲染页面),所以如果在脚本导入之前就嵌入了FLASH,并且FLASH尝试调用JS方法,此时可能JS对象所在的脚本还未执行。我的做法是把嵌入的FLASH的代码放到所有脚本执行之后。

三、JS调用FLASH的时候,FLASH还未初始化完成
FLASH嵌入到页面中后,根据文件大小 ,下载要一定时间,下载完成后,FLASH还要执行初始化操作,其中就包括初始化暴露给JS调用的方法,在这一切没有做好之前,如果JS尝试与FLASH交互,必然会失败。在做好解决上面的第二个问题之后,解决这个问题的办法就是让FLASH通知JS,说自己已经处于READY状态了。

$flashReadyListeners = {};//把FLASH初始化完后要执行的JS写在传递给flashReady的参数fn里面。function flashReady(flashName, fn){  var listeners = $flashReadyListeners[flashName]   if(!listeners)listeners=$flashReadyListeners[flashName]=[];   listeners.push(fn);}//flash初始化完成后调用此方法function flashInit(flashName){   var listeners = $flashReadyListeners[flashName];   if(listeners){    jQuery.each(listeners, function(fn){      typeof fn == "function" && fn();   })   }}//example//在chat.swf载入完成后,调用它jsCall方法flashReady("chat", function(){     getFlash("chat").jsCall("speak","hello");})

四、flash与js相互调用的接口
flash与js要相互调用,要约定好接口方法名,参数个数及意义,一有变化,要改相应代码,FLASH还要重新编译,很是麻烦。目前的做法是:
        先根据需求,讨论好后把接口规范放到WIKI上面。然后通过以下方法路由选择后再调用具体方法。
FLASH代码中的定义
//我不会写FLASH,以下代码不能运行//js调用FLASHfunction jsCall(fnName, args, callback){}//flash调用JSfunction callJs(fnName, args, callback){}


JS代码中的定义
//flash调用JSfunction flashCall(fnName, args, callback){   switch(name){       case name == "updateStatus":             app.$currentUser.updateStatus(args, callback);             break;        default:           thrown  fnName + "未定义";   }}//JS调用FLASHfunction callFlash(flashName, fnName, args, callback){   getFlash(flashName).jsCall(fnName, args, callback);}

参数说明:
@param  fnName {String} 要调用的方法名
@param args {Object} 传递给具体方法的参数HASH,key为字符串
//这样做,你可以给参数定名称,与WIKI对应。然后要增加参数与方便
@param callback {Function} 方法调用后要执行的 回调

目前JS与FLASH的调用,还不算太多,十个左右吧,所以路由实际上用的是IF ELSE 
当然这样做不是很好,具体怎样做,欢迎大家讨论。 1 楼 sogo1986 2010-03-30   swfobject用的比较多.... 2 楼 ghyghoo8 2010-03-31   昨儿弄完一个js与as2交互的东东。
貌似是getURL("javascript:js函数");
还有一个是在该帧引入一个flash类,有两个函数call与addcall,具体忘了~ 3 楼 foodyi 2010-04-02   ghyghoo8 写道昨儿弄完一个js与as2交互的东东。
貌似是getURL("javascript:js函数");
还有一个是在该帧引入一个flash类,有两个函数call与addcall,具体忘了~

用getURL会有浏览器不兼容的情况,例如mac下的safari. 4 楼 ccxw1983 2010-04-03   不了解 FLASH 怎么做,只知道很多纯浏览器干不来的活这个可以干,相当于activex了吧

热点排行