- ベストアンサー
XMLHttpRequestオブジェクトによるレスポンスを複数回受けるには?
以下のようなコードでXMLHttpRequestを試しているのですが、 「レスポンスです。」と表示した後、 いったん違うページに遷移し、再度以下のコードを書いたページに遷移しても 「レスポンスです。」と表示されません。 var obj = new XMLHttpRequest(); obj.open("GET","/test.txt"); obj.setRequestHeader(~略~); obj.send(""); obj.onreadystatechange = function( ){ if(obj.readyState == 4){ alert(obj.responseText); } } -------以下、test.txt-------- レスポンスです。 ----------------------------- ブラウザを閉じ、再びこのコードの書かれたページを表示すると「レスポンスです。」と表示されます。 ブラウザを閉じなくても、ページを表示する度に「レスポンスです。」と表示するにはどうすればよいのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
そのように分岐させる必要はないと思いますよ。 実際そのような事例は見たこともないです。 恐らくですが、必要ないと思います。
その他の回答 (5)
- buffalomasa
- ベストアンサー率66% (70/106)
No4.です。 クロスブラウザを考慮に入れたスクリプトでしたら、これもAjaxでは一般的なのですが以下のようにすればいいと思います。 function GetXmlHttpReqObj() { if (window.ActiveXObject) { // Win e4,e5,e6 try { return new ActiveXObject("Msxml2.XMLHTTP") ; } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP") ; } catch (e2) { return null ; } } } else if (window.XMLHttpRequest) { // Win Mac Linux m1,f1,o8 Mac s1 Linux k3 return new XMLHttpRequest() ; } else { return null ; } } var obj = GetXmlHttpReqObj();
お礼
回答ありがとうございます。 質問文を簡略化するため、質問文ではXMLHttpRequestのオブジェクトしか取っていないのですが、 上記回答いただいているような形で私も分岐をさせております。 (#1の方からの回答に対するお礼にて若干触れております。) XMLHttpRequestのオブジェクトの場合は var File = "/test.txt"; obj.open("GET", File, true); このように特にファイル名を変更せずとも毎回動くので、 このときobjがActiveXObjectかXMLHttpRequestかで分岐をさせる必要はないか?という趣旨の質問でした。 私の質問の説明不足で大変申し訳ありません。 以上、よろしくお願いします。
- buffalomasa
- ベストアンサー率66% (70/106)
No2です。 一端ページを離れて戻ってきた時にファイルをオープンしないのは一種のキャッシュが働いている感じだと思って下さい。そこで静的なファイルをキャッシュさせずに再度読み込もうとするときに、先程と違うファイルにアクセスするのだと勘違いさせます。 わたしの書いたコードはエレガントではなかったので、もう一度別のコードを書きます。 var File = "/test.txt"; obj.open("GET", File + "?" + (new Date()).getTime(), true); こっちの方がいいですね。 ようはアクセスするたびに違うファイルにしているのです。 上のコードを実行させると "/test.txt?326362365" こんな感じになります。 再度実行させると "/test.txt?653256" こんな感じになります。 ?の後ろが実行のたびに変わります。これで別ファイルになるのでキャッシュされずに必ずファイルを開きます。 ?の後ろは完全にダミーなので開くファイルは「/test.txt」です。 これはAjaxでは比較的有名なテクニックです。 一度これで試してみて下さい。
お礼
せっかく回答頂いたのに、お礼が遅くなりまして大変申し訳ありません。 本日言われた通りの動作を試みたところ うまく表示されるようになりました。 本当にありがとうございます。 なるほど、リクエスト先が違うように見せかけているのですね。 すみません、1点追加で質問させてください。 本質問の現象は、主にIE6で見られるのですが、 クロスブラウザを考慮する場合、他のブラウザと分岐させるべきなのでしょうか? 回答文の解説を参考に考えますと、特に分岐させなくとも、 回答文の方法だけでどのブラウザでも動きそうな気がしますが‥?
- buffalomasa
- ベストアンサー率66% (70/106)
No2です。 訂正 var file = "/test.txt?" . rnd; ↓ var file = "/test.txt?" + rnd; 「.」はPerlですね。 どうもJavaScriptはあまり慣れていませんので、申し訳ないです。
- buffalomasa
- ベストアンサー率66% (70/106)
こんにちわ。 例えば、 obj.open("GET","/test.txt"); の箇所を var rnd = Math.floor(Math.random() * 10000); var file = "/test.txt?" . rnd; obj.open("GET","file"); とかにすればどうだろうか?
お礼
回答ありがとうございます。 申し訳ありません、私の知識不足のため、 回答文のコードが何をしているのかわかりません。 みた感じでは、0~10000の整数をtest.txtの引数に与えているようですが?? (すみません、この解釈があっているのかどうかもわかりません。) 0~10000ミリ秒待っている感じでしょうか? お手数ばかりかけまして大変恐縮ですが、 できればもう少し詳細な情報を頂けましたら幸いです。 よろしくお願い申し上げます。
- himajin100000
- ベストアンサー率54% (1660/3060)
IE7 / Minefield / Opera 共に再現しません。 自宅のAN HTTPDサーバの二つのファイル間を往復しても,自分のページへのアクセスでもアドレスバーに打ち込んでもその回数だけ発生します。 #ただし,同一ページ内のフラグメントとか,「戻る」「進む」ボタンでは当然発生しないし,このケースに対する対策は放棄する
お礼
回答ありがとうございます。 そして申し訳ありません。 冗長にならないよう、コードを必要最小限にしたために、 質問文のコードが当該問題から外れていることに気がつきませんでした。 質問本文ではobjはXMLHttpRequestのインスタンスとなっていますが、 実際にはクロスブラウザ対応するため、 ブラウザがIE6以前のときはActiveXObjectのMsxml2.XMLHTTP、 あるいはMicrosoft.XMLHTTPのインスタンスを取得する関数を使用して、 各種ブラウザに合わせたHttpRequest用のインスタンスを生成し、 objに渡しています。 質問文内容の問題はIE6.0でおきています。(このときobjはMsxml2.XMLHTTPのインスタンスとなっております。) さらに先ほど少し実験していて新たなことがわかりました。 質問本文にあるコードの obj.onreadystatechange = function( ){~略~} の後に、 alert(obj.responseText); と入れると、画面遷移をしてから再び戻ってくると「レスポンスです。」と表示されました。 (当然ですが、test.txtが着信する前にレスポンスを受け取ろうとするので、 一回目表示したときはjavascriptエラーが左下に出ます。) つまり、ActiveXObjectでは一度作成したインスタンスはウィンドウが閉じられるまで開放されないということでしょうか? エラーを出していますし、上記のような方法ではなく、もっと一般的な方法があるはずとは思うのですが‥。 また、当方でもFF2,NN7.1,opera9では質問文コードは正しく動くことを確認しました。ありがとうございます。 質問文をIE6.0以前の場合と置き換えて、再度回答をよろしくお願い申し上げます。
お礼
そうですか。 わかりました。 最後まで回答いただき、 本当にありがとうございました。