actionscriptTweet何かとはまりやすいJavaScript-ActionScript連携のExternalInterface。以前にもこんなエントリ書いてました。今回、また新たにハマりポイントがあったのでメモしておきます。document['externalpl'];と、するとplayer.hello();なんかが実行できます。}などとしておく必要があります。今回のハマりは、このJSからASの関数を呼び出すときに、IEの時の場合のみASの関数が実行できない、詳しく言うとASの関数を実行するためのFlashの(関数)オブジェクト参照を取得できず、nullが返ってくるという問題がありました。Safariなどではちゃんとplayerの参照が取得できて(正常に参照が取得できると、関数オブジェクトが取得できます)、helloメソッドの実行もうまくいくわけです。よかれと思ったことが仇に今回、というか僕は常々FlashVarsで値を渡しやすくするために、swfのタグの書き出しはHTMLを直接書くのではなくて、ラップするJavaScriptの関数を作って、それ経由で書き出すようにしています。いわゆるSWFObjectを利用してもいいのですが、たかだかタグ書き出しのためだけにライブラリをロードするのも通信がバカバカしいので自作することが多いです。o.start();な感じでJSのOS#startメソッドを実行するとFlashVarsでtype=windows&name=vistaの値を渡してobject/embedタグが書き出される、のような感じです。しておくと書き出し方法をdocument.writeのように愚直に書き出すこともできるし、swfのサイズが大きい場合にHTMLがロードし終わった後にinnerHTML差し替えによって遅延書き出し方法を取る事も出来ます。このように書き出し方法やそのタイミングを自分の好みで変えられる上に、後者のような方法だとページ全体の体感速度を上げることもできて非常に便利なのです。そこに罠があったのです。swfをonLoad以降に書き出すとマズい今回のケースではjQueryを使って、DOMContentLoaded/onLoadのタイミングでswfを動的に挿入させるようにしていました。要するにこんなかんじ。Tree構築後のタイミング。DOMContentLoadedをサポートしていない場合はonLoadのタイミング。)で処理を実行させることができます。このタイミングで指定ID要素(=上の例だと“#container”)に対してinnerHTMLにobject/embed要素書き換えでswfをロードさせるようにしました。FirefoxやSafariはこれで何ごともなく動くのですが、IEだと動作しません。すればいいか?というと、object/embed要素の書き出し方法をbody.onload時ではなく、単純にXHTML上にdocument.writeでobject/embed要素書き出しに修正すると動きました。この結果から推測するに「IEはbody.onload時(DOMContentLoaded時)において存在しないswfの参照は取得することができない」ということが言えそうです。ExternalInterfaceを利用したい場合は、対象swfはDOMContentLoaded以降にロードされるのではなく、DOMContentLoaded以前にロードされておく必要がある、ということですね。Treeの参照(またはその複製?)がDOMContentLoaded以降に更新されていないように思われます。知っておけばハマらないのですが気づかなければなかなか抜け出せない罠でした。ExternalInterfaceの罠の多さはほんと異常です。それもIEでハマることがやたら多い印象。