论坛首页 Web前端技术论坛

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

浏览 24910 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-29   最后修改:2010-04-01

目录
(一)有关框架
(二)文件组织与代码组织
(三)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调用FLASH
function jsCall(fnName, args, callback){}
//flash调用JS
function callJs(fnName, args, callback){}


JS代码中的定义
//flash调用JS
function flashCall(fnName, args, callback){
   switch(name){
       case name == "updateStatus":
             app.$currentUser.updateStatus(args, callback);
             break;
        default:
           thrown  fnName + "未定义";
   }
}
//JS调用FLASH
function 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 
当然这样做不是很好,具体怎样做,欢迎大家讨论。
   发表时间:2010-03-30  
swfobject用的比较多....
0 请登录后投票
   发表时间:2010-03-31  
昨儿弄完一个js与as2交互的东东。
貌似是getURL("javascript:js函数");
还有一个是在该帧引入一个flash类,有两个函数call与addcall,具体忘了~
0 请登录后投票
   发表时间:2010-04-02  
ghyghoo8 写道
昨儿弄完一个js与as2交互的东东。
貌似是getURL("javascript:js函数");
还有一个是在该帧引入一个flash类,有两个函数call与addcall,具体忘了~


用getURL会有浏览器不兼容的情况,例如mac下的safari.
0 请登录后投票
   发表时间:2010-04-03  
不了解 FLASH 怎么做,只知道很多纯浏览器干不来的活这个可以干,相当于activex了吧
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics