PHPでDBに問い合わせXMLを吐き出すFlashを制作しているのだが、IEでXML読み込みのcompleteイベントが発生しないという症状が出た。ちなみに、Safari, Mozillaでは発生しない。
UI ComponetnsのProgressBarを利用したスクリプトをFlashのAS辞書のサンプルを参考に組んでみた。
var pBarListener = new Object(); //リスナの生成
pBarListener.complete = function(eventObject){
eventObject.target.removeMovieClip(); //自分を削除
}
this.pBar.addEventListener(“complete”,pBarListener ); //リスナの登録
IEだとイベントが発生しないという症状が出てしまったのだ。
解決策として、PHPの出力に、Content-Lengthヘッダーを追加することで対応した。こうすることによって、動的な出力だがファイルサイズをブラウザ側が得ることができるので、読み込み完了が正確になるようである。ただし、ヘッダーで与えたファイルサイズが間違っている場合、Mozillaでは途中までしか読み込まれないので、ヘッダーの値には注意する必要がある。
Content-Length: FILESIZE
Content-Lengthを使うことで、動的な出力でもXML.getBytesTotal()を使ってファイルサイズを得ることができるようになる。また、ProgressBarでも全体ファイルサイズを得ることができるようになり、ロードアニメーションを表示できるようになる。
ただし、マルチバイト文字を使っている場合、PHPでのContent-Lengthへのファイルサイズを与える処理がちょっと面倒くさい。これは、別項で。