网站微营销公司哪家好,重庆建设工程施工安全网,百度外推排名代做,网址之家123上网主页[js] flash如何与js交互#xff1f;
当Flash置于HTML容器中时#xff0c;经常会遇到AS与JS的通信问题#xff0c;例如#xff1a;JS能否调用AS中的变量、方法#xff0c;AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展#xff0c;解决方案也是多种多…[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 typebutton οnclickcallExternalInterface() valueJS调用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函数不能使用递归同时安全域限制也必须在考虑之中。个人简介
我是歌谣欢迎和大家一起交流前后端知识。放弃很容易 但坚持一定很酷。欢迎大家一起讨论
主目录
与歌谣一起通关前端面试题