2007/04/21 (土)  「xmlhttprequestでエラー(Firefox)」
たまには役に立つ情報でも(ぇ

Firefoxで、XMLHttpRequestのopenメソッドを使用してリクエストを送信しようとしたら、
エラー: [Exception... "Component returned failure code: 0x80004005
(NS_ERROR_FAILURE) [nsIXMLHttpRequest.open]" nsresult: "0x80004005
(NS_ERROR_FAILURE)" location: "JS frame ::
http://192.168.xxx.xxx/xxx/xxx.js :: sendXMLHttpRequest :: line 60"
data: no]
ソースファイル: http://192.168.xxx.xxx/xxx/xxx.js
行: 60
って言われて途方にくれてました。
iframeから親ウインドウの関数を呼び出して、XMLHttpRequestを使った通信を行うと、このエラーが出るようです。
日本語サイトでこの情報を書いてるページが見つからなかったので、メモしときます。
#たぶん探し方が悪かったんだと思うけど。


Webページでファイルアップロードするとき、FORMのtargetをiframeにすることで、見た目にはページの遷移が無くアップロードを行うことができますよね。
例:
<form action="xx.cgi" method="post" enctype="multipart/form-data" target="upload_frame">
<input type="file" name="uploadfile">
</form>
<iframe name="upload_frame"></iframe>
iframeは、display:noneのようにしておくと、iframeが見えなくなって吉。

こうした場合、CGIのレスポンスが返ってくるiframeから、親ウインドウ(つまりiframeを記述したページ)に完了通知を出したいですよね。
window.onload = function() {
window.parent.onUploadFinish();
}
onUploadFinish関数はiframeを記述したページに定義してあるものとします。
たとえばこんな感じで、終了を通知するとします。

この通知を受けて、onUploadFinishから、例えば「getDataByXHR」という関数を呼び出すとします。
getDataByXHR関数では、XMLHttpRequestを使った通信を行います。
そうすると、Firefoxさんが前述のエラーを言い渡してきます・・。

どうやら、この現象は以前から明らかになっている問題で、解決策も示されていました。
参考にしたのはこちらです。
Fleegix.org : XMLHttpRequest and 0x80004005 (NS_ERROR_FAILURE) error

結論は、直接目的の関数を呼び出さずに、setTimeoutを使って目的の関数を間接的に呼び出すことで、問題を回避することが出来ます。
XMLHttpRequest();

setTimeout(XMLHttpRequest, 0);
のようにすることで、エラーがでなくなりました。


なんか強引に回避してる感がありますね。。
なお、上記のHTMLやJavaScriptは動作確認しておりませんので、参考までにということで予めご了承ください。


追記:
2007/04/21 (土) 「xmlhttprequestでエラー(Firefox):修正」


★コメント
コメントはありません。


※1ヶ月より前の日記にはコメントができません。



トップページに戻る