本文详解Flash与JavaScript之间的双向通信机制。通过ActionScript的ExternalInterface类,实现JS调用AS函数及AS调用JS函数的具体代码示例。重点解析HTML中Flash嵌入的allowScriptAccess参数配置,以及获取Flash对象引用的thisMovie兼容写法,确保跨浏览器环境下的稳定调用。
Flash与JavaScript交互:ExternalInterface调用详解
Flash使用的ActionScript语言与JavaScript在语法和逻辑上具有高度相似性。下面将具体说明两者之间如何互相调用函数。
1:javascript 调用 flash 中的函数
ActionScript注册与调用JS函数
首先,在Flash的ActionScript脚本中引入必要的类库。
import flash.external.ExternalInterface;
假设需要调用的目标函数名为hello,其ActionScript代码如下所示:
function hello(){
return "hello";
}
ExternalInterface.addCallback("hello", this, hello);
//第一个参数为导出给JS调用的函数名,第三个参数为AS内部的实际函数名。完成此注册后,即可在JavaScript中调用AS的hello函数。
2:flash 调用 js 的函数
ExternalInterface.call("hello2", "jacky");
//第一个参数指定JavaScript中待调用的函数名,后续参数为传递给JS函数的实际参数。
3:如何互相调用
HTML嵌入配置与JS获取Flash对象
对应的HTML嵌入代码如下:
<object type="application/x-shockwave-flash" data="test.swf" width="525" height="390" name="test">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="scale" value="noScale" />
<param name="wmode" value="transparent" />
</object>
JavaScript端的调用代码如下:
function callFromFlash() {
var a=thisMovie("test").hello();
alert(a);
}
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
} else {
return document[movieName]
}
}
//注意,不能使用document.getElementById等常规DOM方法获取网页中的Flash对象,必须使用thisMovie函数中的逻辑进行兼容处理。
国外看到的另一种方法:
使用watch方法监听变量变化
You can't call a function, but you can change/set a variable and use the watch() method to execute the code whenever the value is changed.
ActionScript Code:
function changeType(prop, oldval, newval) {
//do your stuff
return newval;
}
var strType = "";
this.watch("strType", changeType);