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

[size=medium]
[u][b]目录[/b][/u]
[url=http://www.iteye.com/topic/625734](一)有关框架[/url]
[url=http://www.iteye.com/topic/627308](二)文件组织与代码组织[/url]
(三)JS与FLASH交互
[url=http://www.iteye.com/topic/627538](四)ajax局部刷新与RPC[/url]
[url=http://www.iteye.com/topic/628228] (五)获取设置元素样式与监听元素事件[/url]
[url=http://www.iteye.com/topic/629165] (六)页面元素的创建调整与关联[/url]
(七)浏览器兼容性问题
(八)WEB软件的前端架构实践
[/size]
[color=red]文章中的代码只为表达文章意义,非真正能执行的代码。[/color]
[size=large]JS与FLASH交互[/size]
与flash交互遇到的问题
[size=medium]一、由于嵌入标记以及浏览器等原因,导致JS无法调用FLASH中的方法[/size]
使用[url=http://code.google.com/p/swfobject/]swfobject[/url]来嵌入你的FLASH
它的优点有:
[list]
[*]简单简洁,再也不那COPY那一大段的标记了
[*]支持指定FLASH版本,如果版本不够可自动升级
[/list]
[size=medium]二、FLASH调用JS的时候,JS对象还不存在[/size]
由于大部分脚本是放到页面最底部的(这样做的原因是让浏览器先渲染出界面,因为载入脚本时会停止渲染页面),所以如果在脚本导入之前就嵌入了FLASH,并且FLASH尝试调用JS方法,此时可能JS对象所在的脚本还未执行。我的做法是把嵌入的FLASH的代码放到所有脚本执行之后。

[size=medium]三、JS调用FLASH的时候,FLASH还未初始化完成[/size]
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");
})


[size=medium]四、flash与js相互调用的接口[/size]
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 :oops: 。
当然这样做不是很好,具体怎样做,欢迎大家讨论。

你可能感兴趣的:(javascript)