ExternalInterfaceのまとめ
JavaScriptとActionScriptの橋となる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 |