
以下のようなコードで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--------
レスポンスです。
-----------------------------
ブラウザを閉じ、再びこのコードの書かれたページを表示すると「レスポンスです。」と表示されます。
ブラウザを閉じなくても、ページを表示する度に「レスポンスです。」と表示するにはどうすればよいのでしょうか?

No.5
- 回答日時:
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かで分岐をさせる必要はないか?という趣旨の質問でした。
私の質問の説明不足で大変申し訳ありません。
以上、よろしくお願いします。

No.4
- 回答日時:
No2です。
一端ページを離れて戻ってきた時にファイルをオープンしないのは一種のキャッシュが働いている感じだと思って下さい。そこで静的なファイルをキャッシュさせずに再度読み込もうとするときに、先程と違うファイルにアクセスするのだと勘違いさせます。
わたしの書いたコードはエレガントではなかったので、もう一度別のコードを書きます。
var File = "/test.txt";
obj.open("GET", File + "?" + (new Date()).getTime(), true);
こっちの方がいいですね。
ようはアクセスするたびに違うファイルにしているのです。
上のコードを実行させると
"/test.txt?326362365"
こんな感じになります。
再度実行させると
"/test.txt?653256"
こんな感じになります。
?の後ろが実行のたびに変わります。これで別ファイルになるのでキャッシュされずに必ずファイルを開きます。
?の後ろは完全にダミーなので開くファイルは「/test.txt」です。
これはAjaxでは比較的有名なテクニックです。
一度これで試してみて下さい。
せっかく回答頂いたのに、お礼が遅くなりまして大変申し訳ありません。
本日言われた通りの動作を試みたところ
うまく表示されるようになりました。
本当にありがとうございます。
なるほど、リクエスト先が違うように見せかけているのですね。
すみません、1点追加で質問させてください。
本質問の現象は、主にIE6で見られるのですが、
クロスブラウザを考慮する場合、他のブラウザと分岐させるべきなのでしょうか?
回答文の解説を参考に考えますと、特に分岐させなくとも、
回答文の方法だけでどのブラウザでも動きそうな気がしますが‥?

No.3
- 回答日時:
No2です。
訂正
var file = "/test.txt?" . rnd;
↓
var file = "/test.txt?" + rnd;
「.」はPerlですね。
どうもJavaScriptはあまり慣れていませんので、申し訳ないです。

No.2
- 回答日時:
こんにちわ。
例えば、
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ミリ秒待っている感じでしょうか?
お手数ばかりかけまして大変恐縮ですが、
できればもう少し詳細な情報を頂けましたら幸いです。
よろしくお願い申し上げます。
No.1
- 回答日時:
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以前の場合と置き換えて、再度回答をよろしくお願い申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Illustrator でjavascriptによ...
-
誰か知ってますか?
-
PowerPointで時計表示
-
Wordpressでヤフー知恵袋やgoo...
-
コメント欄に顔文字一覧をつけ...
-
jQuery ui Datepicker 明日以降...
-
InDesign javascript について
-
Perl LINE(チャット) 仕組み
-
webサイトでjqueryを使うと普通...
-
コードの意味 ("Scripting.Dict...
-
【JavaScript】DOMContentLoade...
-
javaScriptでグローバル変数に...
-
JavaScriptで複数のプロパティ...
-
HTML5のことについてなのですが……
-
このJavaScriptのどこが間違っ...
-
gas 全角数字を半角数字に変換
-
jquery(javascript)で分から...
-
jquery の書き始めについて
-
Canvasによるお絵描きスクリプ...
-
Ajaxで通信したJavascript動作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ブラウザからエクセルを開く方法
-
JavaScriptでテキス...
-
XMLHttpRequestオブジェクトに...
-
ActiveXObjectについて
-
Ajaxが動きません~『status=0』?
-
ajax 通信 iisの設定?
-
JavaScriptによる....
-
フレームで開いたページのリン...
-
ローカル環境で動作しないJavaS...
-
javascriptによるメール送信
-
jsでルートディレクトリより上...
-
javascriptでのmdb接続について
-
画像のプレビューについて
-
FBのいいねボタンが表示されま...
-
IEの右クリックメニューからの...
-
javascriptでテキストファイル...
-
外部SVGの参照
-
JavaScriptでファイルの保存
-
html組込み時のカレントフォル...
-
JSPの処理の途中で、JavaScript...
おすすめ情報