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にすることで、見た目にはページの遷移が無くアップロードを行うことができますよね。 例: iframeは、display:noneのようにしておくと、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> こうした場合、CGIのレスポンスが返ってくるiframeから、親ウインドウ(つまりiframeを記述したページ)に完了通知を出したいですよね。 window.onload = function() { onUploadFinish関数はiframeを記述したページに定義してあるものとします。window.parent.onUploadFinish(); } たとえばこんな感じで、終了を通知するとします。 この通知を受けて、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):修正」 |
||
2007/04/21 01:26:53 / お仕事
|