SWFからJavaScriptの関数を呼び出し返り値を得る

まだFlashMXを使っていて、Flash6.0+Webサービスということをやろうとすると、ActionScriptXMLを解析してオブジェクト化するスクリプトを作るのが非常に面倒くさかったりする。そこで、この作業をJavaScriptAJAXライブラリ(prototype.jsとか)でやってしまって、実際にオブジェクト化された値をswfで受け取るというプロセスができたら、すごく嬉しいかも。早い話、SWF側からJavaScriptのメソッドをコールして、JavaScript内で作成したオブジェクトをActionScript内の変数へセットできたらすごく便利だということ。
実際にやってみると、returnを使って返り値を得ることができないみたいなので、少し複雑な構成になってしまった。でも便利そうなので、メモしておくことにする。

ActionScriptからJavaScriptの関数を呼び出すメソッド

//状態を示す変数flagObjをセット
var flagObj = "waiting";

//JavaScripから受け取る値を格納する変数をセット
var returnVar = "";

//イベントが起きたら、JavaScriptをコールするメソッド「callMethod」を呼び出す
//同時にflagObjをcallにする
buttonCaller.onRelease = function() {
	callMethod();
	_parent.flagObj = "call";
}

//JavaScriptをコールするメソッドcallMethodの定義
function callMethod() {
	putVar = "javascript: returnMethod()";	//コール文の作成
	getURL(putVar);	//コール
	loader.loadAction();	//ローディング開始
}

//onEnterFrameを使って、flagObjのチェック。
//flagObjがreturn状態になったら、SWF側でオブジェクトを作成
this.onEnterFrame = function() {
	if (flagObj == "return") {
		createObj();	//オブジェクトの作成
		loader.loadedAction();	//ロード終了
		flagObj = "waiting";	//flagObjをふたたびwaitingに
	}
}
という具合。 まず状況を監視するための変数を用意し、そこに今の状態を参照できるようにしておく。 それをonEnterFrameイベントで監視し、if文を使ってflagObjの値によってSWFの動きを制御する。 こうしておけば、JavaScriptからflagObjの値を書き換えることで、 JavaScript内での処理が終わり、変数が返ってきたらSWFが再び出すという構成がセットできるというわけだ。
次は、JavaScript側からSWFの変数を書き換えるメソッドを書かなければならない。

JavaScriptからSWFの制御をするには、JavaScriptがHTML内のSWFを認識しなければならないので、DOMを使ってオブジェクト化しておく。実際にはブラウザによってDOMの位置が違うが、ライブラリ使用を前提と考えて、あまり問題視はしない。とりあえずFirefoxでは、
window.document['SWFの参照値']Firefox
でSWFを参照することができる。参照値は、objectタグの中のid属性と、embedタグのname属性にセットしておけば良い。また、swLiveConnect属性をtrueに設定しておくのも忘れずに。(さっきテストした時はなくても動いたが…)
そして、SWFに値を送るためには、関数はあらかじめ用意されている。それは、
SetVariable("variable","value");
でSWFのvariable変数に"value"を代入することができる。

JavaScriptからSWFの変数に値をセットする処理

//SWFからコールされるメソッドの定義
function returnMethod() {
	//実際のJavaScriptでの処理
	createAJAXObj();
	xmlParse();
	・・・・・・
	//最後にオブジェクトを返して、変数flagをreturnにする
	window.document["SWFfile"].SetVariable("returnVar", returnObj);
	window.document["SWFfile"].SetVariable("flagObj", "return");
}
とこうなる。ポイントは最後にSWF内のflagをreturnにすること。
SWF内では変数flagの監視によって動きを制御してるので、これを書き換えるだけで、JavaScriptからSWFの制御が可能だ。非常にシンプル。だから注意するのは変数flagの書き換えタイミングだけで、あとはどれだけJavaScript側の処理が複雑だろうと、時間がかかろうと関係ないことになる。

とりあえずこれで、SWF→JavaScriptCGIWebサービスの連携が簡単に出来ると。さあ、何を作ろうかなあ。