JavaScript与Flash的通信解析

当Flash置于HTML容器中时,经常会遇到AS与JS的通信问题,例如:JS能否调用AS中的变量、方法,AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展,解决方案也是多种多样的。
  在我总结的
[url=http://www.v-sky.com/blog/?p=179][1b]
[color="#80ae14"]HTML与FLASH之间的“静态”传值[/color]
[/1b][/url]
一文中提到了JS使用SetVariable方法来设置FLASH中的变量,
[url=http://www.klstudio.com/][1b]
[color="#80ae14"]kinglong[/color]
[/1b][/url]
认为此法已经过时。对此我表示同意,但上文重点毕竟不是在讨论JS与AS的通信,因此另外对AS与JS通信做一个个人总结,欢迎大家讨论。
  实现JS跟AS的通信,目前可选方法比较多,但[1b]早期的方法[/1b]在使用便捷和功能上都不是很完美,下面做一简要说明:
  [1b]一、getURL[/1b]  getURL("javascript:history.go(-1)");
  通过URL协议来访问页面中的javascript,上面控制浏览器历史的代码很眼熟吧,诸如此类我们平时在定制页面收藏,发送邮件时都会经常使用这种方式。虽然你也可以调用页面中自己定义的JS函数,但我个人认为局限性还是比较大,函数的参数传递并不是很灵活,无返回值,而且只能实现AS调用JS,反之不行。
  [1b]二、fscommand命令[/1b]
  使用fscommand来调用AS定义的方法也是一个很常用的方式,但我们需要在HTML页面中定义一个具有规定格式的myFlash_DoFSCommand函数,首先定义这个函数我个人就觉得麻烦,而且也只能实现AS调用JS,无函数返回值。
  [1b]三、SetVariable[/1b]  
  上面两种方法都只能实现AS调用JS,而SetVariable恰恰相反,只要我们稍微做下处理,他就可以帮我们变相调用AS中的方法。大概思路如下:AS中设置一个状态变量,并使用Object的watch方法对其监视,JS通过SetVariable来修改这个状态变量,一旦侦测到了变量的改变,那就可以根据不同的状态值来选择执行AS中的相应函数了。如果需要考虑用户的低版本播放器,那么你可以考虑下该方法,个人认为还是比较灵活的。
  可以看出上面的这些做法都有一定的局限性,所以在我们的应用中很多时候都不得不将他们结合使用。而下面我要具体介绍的就是[1b]ExternalInterface[/1b]的做法,通过它你能轻松实现[1b]AS与JS的双向方法调用[/1b],从而也解决了双向的变量访问,详细介绍可参见FLASH帮助文档和
[url=http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_15683]
[color="#80ae14"]Adobe的官方教程[/color]
[/url]
,下面用两个简单例子来说明ExternalInterface的使用。
一、AS调用JS的方法([1b]
[url=http://www.v-sky.com/demo/ExternalInterface/astojs/demo.html]
[color="#80ae14"]实例演示[/color]
[/url]
[/1b])
Flash中代码:
//导入包
import flash.external.*;
get_btn.onRelease = function(){
//调用页面中的JS函数
[color="#ff0000"]var temp_str = String(ExternalInterface.call("say", "Hello,World"));
[/color]
result_txt.text = temp_str;
}
Html中代码:function say(txt){
return txt;
}
  没错,就这么简单,JS函数定义没有任何要求,AS中使用call方法直接调用就可以了。
二、JS调用AS的方法([1b]
[url=http://www.v-sky.com/demo/ExternalInterface/jstoas/demo.html]
[color="#80ae14"]实例演示[/color]
[/url]
[/1b])
FLASH中代码://导入包
import flash.external.*;
//提供JS访问的函数名
var _method:String = "say";
//指定本地函数中this变量的作用域,可设置为null留空
var e_area:Object = null;
//AS内部函数名
var method:Function = say;
//将函数注册到容器列表
[color="#ff0000"]var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, e_area, method);
[/color]
//查看注册是否成功
if(
[color="#ff0000"]wasSuccessful[/color]
){
result_txt.text = "函数注册成功";
}
//本地的函数
function say(txt:String) {
result_txt.text = txt;
}
Html中代码:
function callExternalInterface() {
[color="#ff0000"]thisMovie("demo").say("Hello,World");
[/color]
}
//浏览器兼容访问DOM
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
  其中红色代码是核心代码,其作用原理是AS端通过addCallback函数把AS内部定义的方法注册为可从容器中调用,允许自定义另外一个方法名供JS来调用这个方法,函数调用成功返回true,失败返回flase,在此例中通过wasSuccessful变量来判断函数是否注册成功。函数注册成功以后,JS可以通过DOM来访问SWF对象,然后直接调用预定义的方法即可。
  
  通过比较可以看出,使用ExternalInterface来完成AS和JS的通信,[1b]
[color="#ff0000"]代码可以更简洁,更清晰,功能也更强大[/color]
[/1b],不过还有些细节你需要了解,[1b]需要使用8.0以上的播放器,对于调用的JS函数不能使用递归,同时安全域限制也必须在考虑之中[/1b]。
本文转自:http://www.5uflash.com/flashjiaocheng/Flashyuweb/3173.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值