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调用FLASHfunction jsCall(fnName, args, callback){}//flash调用JSfunction callJs(fnName, args, callback){}
//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);}