ExternalInterfaceのまとめ

JavaScriptActionScriptの橋となるExternalInterfaceがなかなか言う事を聞いてくれませんでした。かなりBK。とりあえずまとめておくので、参考にしてください。

allowScriptAccess=alwaysにする

ドメインから読み込んだものも動作させたい場合にはalwaysにする

objectタグのIDには必ず"external"という文字を入れなければいけない

IEでは次のようなパターンになっていないとaddCallbackが動作しない。正規表現で/.*external.*/
例えばexternalHoge

HTMLのフォームタグの中に入れてはいけない

IEではformタグのなかにobjectタグが入っていると動かない

スクリプトで動的に要素を追加する場合には注意が必要

例えばobjectタグのコンテナであるdivタグを生成した直後にobjectタグを追加すると動作しない
divタグを生成して、DOMツリーに登録されてから処理しないといけない
例えば下のようなかんじでinnerHTMLへの代入は遅延させなければいけない。ちなみにsetTimeoutすれば、必ずbodyにdivタグが追加されたあとにinnerHTMLが実行される

var container = document.createElement('div');
document.body.appendChild(container);
setTimeout(function() {
	container.innerHTML = '<OBJECT id=externalHoge height=100 width=100 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>\
		<PARAM NAME="Movie" VALUE="CrossDomainBridge.swf?' + new Date().getTime() + '"><PARAM NAME="Src" VALUE="CrossDomainBridge.swf?' + new Date().getTime() + '">\
		<PARAM NAME="WMode" VALUE="Transparent"><PARAM NAME="AllowScriptAccess" VALUE="always"></OBJECT>';
	}
, 1);

ちなみに上のソースはIE

swfのURLには時間をつける

IEでは同一URLのobjectタグを貼るとSWFのコンストラクタが1回しか呼ばれない。
他のブラウザでは問題ないけど、しょうがないからswfのURLの最後に時間をつけて別のswfだと信じ込ませる
上のソースはそのようにしてます

from CrossDomainBridge

CrossDomainBridgeを作るときにここらへんのテクニックを使ってます


こうしてみるとIEで散々な事になってるな〜
他にもれがあったら教えてくれると嬉しいです。


明日からまたもや旅行だ〜



追記:2008/01/06
新たに発見したので追加

JavaScriptからメソッドがコールされる場合、文字列の改行文字が異なる

ExternalInterfaceはブラウザによって入力される改行コードが異なる - jiroの日記

ブラウザ 改行コード
IE6 \r\n
FF2 win \n
Opera9 win \r\n
FF2 mac \n
Safari2 mac \n