[js] flash如何与js交互?

当Flash置于HTML容器中时,经常会遇到AS与JS的通信问题,例如:JS能否调用AS中的变量、方法,AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展,解决方案也是多种多样的。
在我总结的HTML与FLASH之间的“静态”传值一文中提到了JS使用SetVariable方法来设置FLASH中的变量,kinglong认为此法已经过时。对此我表示同意,但上文重点毕竟不是在讨论JS与AS的通信,因此另外对AS与JS通信做一个个人总结,欢迎大家讨论。
实现JS跟AS的通信,目前可选方法比较多,但早期的方法在使用便捷和功能上都不是很完美,下面做一简要说明:一、getURL  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中代码:
//导入包
import flash.external.*;
get_btn.onRelease = function(){
//调用页面中的JS函数
var temp_str = String(ExternalInterface.call("say", "Hello,World"));
result_txt.text = temp_str;
}
Html中代码:function say(txt){
return txt;
}没错,就这么简单,JS函数定义没有任何要求,AS中使用call方法直接调用就可以了。二、JS调用AS的方法(实例演示)FLASH中代码://导入包
import flash.external.*;
//提供JS访问的函数名
var _method:String = "say";
//指定本地函数中this变量的作用域,可设置为null留空
var e_area:Object = null;
//AS内部函数名
var method:Function = say;
//将函数注册到容器列表
var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, e_area, method);
//查看注册是否成功
if(wasSuccessful){
result_txt.text = "函数注册成功";
}
//本地的函数
function say(txt:String) {
result_txt.text = txt;
}
Html中代码:<div>
<form>
<input type="button" οnclick="callExternalInterface()" value="JS调用AS方法" />
</form>
<script>
function callExternalInterface() {
thisMovie("demo").say("Hello,World");
}
//浏览器兼容访问DOM
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
</script>
</div>
其中红色代码是核心代码,其作用原理是AS端通过addCallback函数把AS内部定义的方法注册为可从容器中调用,允许自定义另外一个方法名供 JS来调用这个方法,函数调用成功返回true,失败返回flase,在此例中通过wasSuccessful变量来判断函数是否注册成功。函数注册成功以后,JS可以通过DOM来访问SWF对象,然后直接调用预定义的方法即可。通过比较可以看出,使用ExternalInterface来完成AS和JS的通信,代码可以更简洁,更清晰,功能也更强大,不过还有些细节你需要了解,需要使用8.0以上的播放器,对于调用的JS函数不能使用递归,同时安全域限制也必须在考虑之中。

个人简介

我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。欢迎大家一起讨论

主目录

与歌谣一起通关前端面试题

[js] flash如何与js交互?相关推荐

  1. flash和js通过什么类如何交互

    flash和js通过类ExternalInterface进行交互. ExternalInterface有两个方法call和addCallback: 1.ExternalInterface.addCal ...

  2. flash和js通过什么类如何交互?

    ExternalInterface 接口,有两个方法call和addCallback call的作用:让Flash调用js里的方法. addCallback是用来注册flash函数让js调用.

  3. flash和js通过ExternalInterface类进行交互

    Flash提供了ExternalInterface接口与JavaScript通信 两个方法: call和addCallback 作用: call让Flash调用js里的方法 addCallback是用 ...

  4. as3是js和java_AS3与JS进行交互(一)

    这个话题在网上应该说很好找,有很多这方面的资料.比者也看过一些,不过大部分都是AS2与JS进行交互.很少提到AS3,即使有,也让人感觉浅尝辄止.很多东西并没有介绍的太清楚.所有笔者萌生了写这样一篇教程 ...

  5. 转载:js和as间的交互

    转载一: 提及AS3与外部脚本的交互,笔者认为可以总结成两种.一是AS3调用外部函数,二是外部脚本调用AS3函数.无外乎就 这两种.在调用函数的同时,我们还可以向函数传递一些参数.这就达到了传递数据的 ...

  6. 如何复制代码到剪贴板?JS/FLASH...

    目前,如果使用javascript来写复制到剪贴板的代码,一般都是浏览器不兼容的.所以采用flash的方式,模拟一个层,再来复制,就可以做到全部浏览器都适用哦~ 需要下载一个swf文件,和一个js文件 ...

  7. Ember.js如何与后端服务交互?adapter、store、ember data关系揭秘

    2019独角兽企业重金招聘Python工程师标准>>> 文章来源:Ember Teach 本项目讲解如何使用adapter.EmberData以及怎么连接到本地数据库. 项目简介 主 ...

  8. Ember.js如何与后端服务交互?adapter、store、ember data关系揭秘 1

    文章来源:Ember Teach 本项目讲解如何使用adapter.EmberData以及怎么连接到本地数据库. 项目简介 主要内容 适配器使用 如何持久化数据到本地数据库 简单的后端服务 最近经常有 ...

  9. doo14 视图和js的按钮上面的交互

    doo14 视图和js的按钮上面的交互 自定义按钮上面的属性应用操作 js代码块 odoo.define({var FormController = require('web.FormControll ...

最新文章

  1. jquery ajax下拉联动,基于jQuery Ajax实现下拉框无刷新联动
  2. c语言入门经典18个程序
  3. Jmeter响应中中文乱码怎么解决?
  4. vod点歌系统_专业音响系统常见故障及修理方法
  5. spyder ctrl + 鼠标左键点击函数 无法跳转
  6. 正则表达式 转义字符
  7. C++求复数的角度_单词复数规则:tomato的复数究竟是加s还是es?
  8. 华为鸿蒙16号开发大会,刚刚!华为2019年开发者大会,鸿蒙系统正式雄起
  9. video.js的简单用法
  10. 小程序报错提示Unexpected token in JSON at position
  11. 怎么判断日出时间早晚_怎样知道当地每天几点日出?
  12. Git问题Everything up-to-date正确解决方法
  13. 域环境批量推送OUTLOOK签名
  14. Niushop单商户V4稳定版重构上新啦!
  15. Java 11已经不再完全免费,不要陷入Oracle的Java 11陷阱
  16. Windows10设置开机自启动文件(或删除)
  17. bvp4c求边值问题matlab,例子10.6-3_bvp4c求解边值问题
  18. 【51单片机】定时器/计数器的工作原理和结构(一)
  19. 【博学谷学习记录】超强总结,用心分享|大数据之Hive
  20. matlab去除语音噪声,基于MATLAB的语音噪声处理及实现

热门文章

  1. python 2.7 error: Microsoft Visual C++ 9.0 is required
  2. Python笔记 【无序】 【五】
  3. http 请求头和响应头
  4. 设计模式(一)---简单工厂模式
  5. 面向对象的需求分析方法
  6. web前端实战系列[1]——三列布局
  7. uva minesweep 水题
  8. Razor 也可说是一个asp.net模板引擎,用不着学习 T4 了
  9. mysql mdl 锁_MySQL MDL锁
  10. java json utf-8_Java 编码 和JSON