ActionScriptとJavaScriptの連携(ExternalInterface)

ActionScriptからJavaScriptを呼んだり、またはその逆をやりたいときはExternalInterfaceを使えばいいんだけど、今までやったことなくて、少しハマったのでメモしておく。

ActionScriptからJavaScriptの関数を呼ぶ。

ExternalInterface.callを使う。

Security.allowDomain(ExternalInterface.call("function() { return location.hostname }"));
// javascriptのalertを呼ぶ。
ExternalInterface.call("alert('hello')");

JavaScriptからActionScriptの関数を呼ぶ。

ExternalInterface.addCallbackで、JavaScriptから呼び出したい関数を登録しておく。
JavaScript側で、埋め込まれたSWFObjectを取得して、その取得したオブジェクトに対して、addCallbackで登録しておいたメソッドを呼び出す。

// ActionScript側
//  第1引数が、JavaScript側で呼び出すときの関数名になる。
//  第2引数が、登録する関数。 第1引数と第2引数の関数名は同じでなくてもよい。
ExternalInterface.addCallback("doSomething", doSomething);
public function doSomething():void {
  // 何かする。
}
// JavaScript側。swfobject.jsを使って埋め込んだとする。
var flashvars = {};
var params = {
                menu: "false",
		scale: "noScale",
		allowFullscreen: "true",
		allowScriptAccess: "always",
		bgcolor: "#FFFFFF"
	      };
var attributes = {
	        id:"AppTest",
                name:"AppTest"
};
swfobject.embedSWF("AppTest.swf", "altContent", "100%", "100%", "9.0.0", "expressInstall.swf", flashvars, params, attributes);

// この関数を呼べば、上で登録したActionScriptの関数が呼べる。
function callActionScript() {
    var swf = document.getElementById("AppTest");  // attributesのidを指定する。
    swf.doSomething();
}