ページで Javascript を呼び出してデータを取得する必要がある Flash ゲームに取り組んでいます。Flash から Javascript を呼び出すことができます。Javascript から Flash 関数を呼び出すと (多くの場合)、そうではありません。
Gaia フレームワークを使用しています。
何が起こるのですか:
- swf は SWFObject で読み込まれます
- 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 Player のデバッグ バージョンを実行しています。
- 私の呼び出しはブロック
ExternalInterface.addCallback()
にラップされています。try...catch
JS エラーが発生すると、catch
ブロックはトリガーされません。サイレント失敗です。 - エラーは、swf がページと同じサーバーからロードされた webhost でテストするときに発生します。
- 設定し
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(); }
});