我正在开发一个需要在页面上调用一些 Javascript 并从中获取数据的 Flash 游戏。从 Flash 调用 Javascript 有效。从 Javascript 调用 Flash 函数(通常)不会。
我正在使用Gaia 框架。
怎么了:
- 使用 SWFObject 加载 swf
- Flash 文件中有一个按钮。单击时,它用于
ExternalInterface.call()调用 Javascript 函数。这行得通。 - Javascript 函数调用一个 Flash 函数,该函数使用
ExternalInterface.addCallback(). - 有时,Javascript 会产生以下错误:
TypeError: myFlash.testCallback is not a function. - 当错误发生时,它会影响所有注册的函数
addCallback()。Gaia 和它的一些包含的库使用addCallback(),并且从 Javascript 调用这些函数也会产生 TypeError。 - 在Flash中按下按钮之前等待很长时间并不能解决错误。
- 定期重试 Flash
addCallback()并不能解决错误 - 发生错误时,
ExternalInterface.available = true并ExternalInterface.objectID包含 Flash 嵌入对象的正确名称。 - 发生错误时,
document.getElementById('myflashcontent')正确返回 Flash 嵌入对象。
编辑添加:
- 此问题出现在 Firefox 3.6 中,但未出现在 Chrome 或 IE8 中。我没有尝试过旧的浏览器。
- 我正在运行 Flash 播放器的调试版本。
- 我的电话
ExternalInterface.addCallback()被包裹在一个try...catch块中。发生 JS 错误时,不会触发catch块。这是一个无声的失败。 - 在 webhost 上进行测试时会发生错误,swf 是从与其所在页面相同的服务器加载的。
- 我设置
allowScriptAccess = always。 - 设置
flash.system.Security.allowDomain("mydomain")并不能修复错误。
从我的页面类:
public class MyPage extends AbstractPage
{
// declarations of stage instances and class variables
// other functions
override public function transitionIn():void
{
send_button.addEventListener(MouseEvent.MOUSE_UP, callJS);
exposeCallbacks();
super.transitionIn();
}
private function exposeCallbacks():void
{
trace("exposeCallbacks()");
if (ExternalInterface.available) {
trace("ExternalInterface.objectID: " + ExternalInterface.objectID);
try {
ExternalInterface.addCallback("testCallback", simpleTestCallback);
trace("called ExternalInterface.addCallback");
}
catch (error:SecurityError) {
trace("A SecurityError occurred: " + error.message + "\n");
}
catch (error:Error) {
trace("An Error occurred: " + error.message + "\n");
}
}
else {
trace("exposeCallbacks() - ExternalInterface not available");
}
}
private function simpleTestCallback(str:String):void
{
trace("simpleTestCallback(str=\"" + str + "\")");
}
private function callJS(e:Event):void
{
if (ExternalInterface.available) {
ExternalInterface.call("sendTest", "name", "url");
}
else {
trace("callJS() - ExternalInterface not available");
}
}
}
我的Javascript:
function sendTest(text, url) {
var myFlash = document.getElementById("myflashcontent");
var callbackStatus = "";
callbackStatus += '\nmyFlash[testCallback]: ' + myFlash['testCallback'];
//console.log(callbackStatus);
var errors = false;
try {
myFlash.testCallback("test string");
}
catch (err) {
alert("Error: " + err.toString());
error = true;
}
if (!error) {
alert("Success");
}
}
var params = {
quality: "high",
scale: "noscale",
wmode: "transparent",
allowscriptaccess: "always",
bgcolor: "#000000"
};
var flashVars = {
siteXML: "xml/site.xml"
};
var attributes = {
id: "myflashcontent",
name: "myflashcontent"
};
// load the flash movie.
swfobject.embedSWF("http://myurl.com/main.swf?v2", "myflashcontent",
"728", "676", "10.0.0", serverRoot + "expressInstall.swf",
flashVars, params, attributes, function(returnObj) {
console.log('Returned ' + returnObj.success);
if (returnObj.success) { returnObj.ref.focus(); }
});