请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 11753|回复: 13

[服务器端交互] JavaScript与Flash的通信 [复制链接]

yoyokings 楼主

小力

银牌会员

帖子
449
体力
2297
威望
9
发表于 2007-6-5 20:20:26 |显示全部楼层
  当Flash置于HTML容器中时,经常会遇到AS与JS的通信问题,例如:JS能否调用AS中的变量、方法,AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展,解决方案也是多种多样的。

  在我总结的HTML与FLASH之间的“静态”传值一文中提到了JS使用SetVariable方法来设置FLASH中的变量,kinglong认为此法已经过时。对此我表示同意,但上文重点毕竟不是在讨论JS与AS的通信,因此另外对AS与JS通信做一个个人总结,欢迎大家讨论。

  实现JS跟AS的通信,目前可选方法比较多,但早期的方法在使用便捷和功能上都不是很完美,下面做一简要说明:

  一、getURL  

  1. getURL("javascript:history.go(-1)");
复制代码

  通过URL协议来访问页面中的javascript,上面控制浏览器历史的代码很眼熟吧,诸如此类我们平时在定制页面收藏,发送邮件时都会经常使用这种方式。虽然你也可以调用页面中自己定义的JS函数,但我个人认为局限性还是比较大,函数的参数传递并不是很灵活,无返回值,而且只能实现AS调用JS,反之不行。

  二、fscommand命令

  使用fscommand来调用AS定义的方法也是一个很常用的方式,但我们需要在HTML页面中定义一个具有规定格式的myFlash_DoFSCommand函数,首先定义这个函数我个人就觉得麻烦,而且也只能实现AS调用JS,无函数返回值。

  三、SetVariable

  上面两种方法都只能实现AS调用JS,而SetVariable恰恰相反,只要我们稍微做下处理,他就可以帮我们变相调用AS中的方法。大概思路如下:AS中设置一个状态变量,并使用Object的watch方法对其监视,JS通过SetVariable来修改这个状态变量,一旦侦测到了变量的改变,那就可以根据不同的状态值来选择执行AS中的相应函数了。如果需要考虑用户的低版本播放器,那么你可以考虑下该方法,个人认为还是比较灵活的。

  可以看出上面的这些做法都有一定的局限性,所以在我们的应用中很多时候都不得不将他们结合使用。而下面我要具体介绍的就是ExternalInterface的做法,通过它你能轻松实现AS与JS的双向方法调用,从而也解决了双向的变量访问,详细介绍可参见FLASH帮助文档和Adobe的官方教程,下面用两个简单例子来说明ExternalInterface的使用。

一、AS调用JS的方法(实例演示)
Flash中代码:

  1. //导入包
  2. import flash.external.*;
  3. get_btn.onRelease = function(){
  4. //调用页面中的JS函数
  5. [color=Red]var temp_str = String(ExternalInterface.call("say", "Hello,World"));[/color]
  6. result_txt.text = temp_str;
  7. }
  8. Html中代码:function say(txt){
  9. return txt;
  10. }
复制代码

  没错,就这么简单,JS函数定义没有任何要求,AS中使用call方法直接调用就可以了。

二、JS调用AS的方法(实例演示)
FLASH中代码:
  1. //导入包
  2. import flash.external.*;
  3. //提供JS访问的函数名
  4. var _method:String = "say";
  5. //指定本地函数中this变量的作用域,可设置为null留空
  6. var e_area:Object = null;
  7. //AS内部函数名
  8. var method:Function = say;
  9. //将函数注册到容器列表
  10. [color=Red]var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, e_area, method);[/color]
  11. //查看注册是否成功
  12. if([color=Red]wasSuccessful[/color]){
  13. result_txt.text = "函数注册成功";
  14. }
  15. //本地的函数
  16. function say(txt:String) {
  17. result_txt.text = txt;
  18. }
复制代码

Html中代码:


  1. <div>
  2. <form>
  3. <input type="button" onclick="callExternalInterface()" value="JS调用AS方法" />
  4. </form>
  5. <script>
  6. function callExternalInterface() {
  7. [color=Red]thisMovie("demo").say("Hello,World");[/color]
  8. }
  9. //浏览器兼容访问DOM
  10. function thisMovie(movieName) {
  11. if (navigator.appName.indexOf("Microsoft") != -1) {
  12. return window[movieName]
  13. }
  14. else {
  15. return document[movieName]
  16. }
  17. }
  18. </script>
  19. </div>
复制代码


  其中红色代码是核心代码,其作用原理是AS端通过addCallback函数把AS内部定义的方法注册为可从容器中调用,允许自定义另外一个方法名供JS来调用这个方法,函数调用成功返回true,失败返回flase,在此例中通过wasSuccessful变量来判断函数是否注册成功。函数注册成功以后,JS可以通过DOM来访问SWF对象,然后直接调用预定义的方法即可。
  
  通过比较可以看出,使用ExternalInterface来完成AS和JS的通信,代码可以更简洁,更清晰,功能也更强大,不过还有些细节你需要了解,需要使用8.0以上的播放器,对于调用的JS函数不能使用递归,同时安全域限制也必须在考虑之中

  欢迎大家加入讨论,如承蒙转载,请注明出处:http://www.v-sky.com/blog/index.php/archives/180

[ 本帖最后由 yoyokings 于 2007-6-5 20:22 编辑 ]
已有 1 人评分威望 收起 理由
jimohuoshan + 3 原创内容

总评分: 威望 + 3   查看全部评分

西部数码顶级域名注册商39元抢注!
yoyokings 楼主

小力

银牌会员

帖子
449
体力
2297
威望
9
发表于 2007-6-6 08:07:01 |显示全部楼层
评分不是目的,希望大家交流,分享,这样才能共同进步。
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

帖子
137
体力
296
威望
0
发表于 2007-6-6 17:46:01 |显示全部楼层
还不错 ~
邓败

使用道具 举报

帖子
137
体力
296
威望
0
发表于 2007-6-6 17:47:13 |显示全部楼层
我用的就是EXternalInterface
邓败

使用道具 举报

帖子
24
体力
65
威望
0
发表于 2007-6-6 17:48:44 |显示全部楼层
谢谢楼主  很实用  收藏先

使用道具 举报

黑马GG

银牌会员 手机认证 

帖子
449
体力
1700
威望
0
居住地
江苏省 淮安市
发表于 2007-6-6 17:52:58 |显示全部楼层
我上次也用了一次
在AS中让网页中的JS执行

具体效果看这里

www.heimavod.cn
随便点击一个电影观看
之前有FLASH  等动画播放完毕后就会自动隐藏  这就是AS和网页JS的通讯
闪着生活,指不定哪天就灭了

使用道具 举报

mjking 

我是7Yue

荣誉管理

帖子
1454
体力
1518
威望
13
发表于 2007-6-6 21:13:51 |显示全部楼层
labs.adobe.com
FABridge,里面详细描述了Flex(AS3)和AJAX(JS)的通讯方式。
失去执着,将一无所有。
www.7yue.com

使用道具 举报

幽谷鸟

银牌会员

帖子
883
体力
2830
威望
2
居住地
广东省 深圳市
发表于 2007-6-7 17:40:59 |显示全部楼层
好贴,珍藏先,抽空汲收

使用道具 举报

帖子
19
体力
87
威望
0
发表于 2007-6-12 15:18:09 |显示全部楼层
感谢楼主分享

使用道具 举报

帖子
54
体力
58
威望
0
发表于 2007-6-12 20:28:02 |显示全部楼层
我以前用的是swfobject,能在html里通过addVariable向flash传递变量
游民部落格

使用道具 举报

yoyokings 楼主

小力

银牌会员

帖子
449
体力
2297
威望
9
发表于 2007-6-12 21:24:56 |显示全部楼层
原帖由 icedesign 于 2007-6-12 20:28 发表
我以前用的是swfobject,能在html里通过addVariable向flash传递变量

这个是不一样的SWFObject是对flashvars的包装

使用道具 举报

skybot 

size

钻石会员 手机认证 

帖子
3236
体力
12466
威望
7
发表于 2008-3-21 11:13:49 |显示全部楼层
谢谢楼主啊...CSDN上也找不倒这里找到啦
http://www.qlili.com 个人站帮点啊

使用道具 举报

帖子
16
体力
46
威望
0
居住地
湖北省 武汉市
发表于 2008-7-8 17:21:17 |显示全部楼层
楼主在传道授业解惑,感谢

使用道具 举报

jykgps 
帖子
7
体力
25
威望
0
发表于 2008-7-22 12:22:35 |显示全部楼层
好贴,正需要这种方法呢,顶上去。
phperz.com

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 13:16 , Processed in 0.116477 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部