以下のようなコードで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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Excel(エクセル) 【エクセルマクロ】既に開いているIEの、サイズや表示位置を変更するには 4 2022/12/01 22:57
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/08 15:45
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- PHP PHP ページング データベース 1 2022/06/16 10:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLHttpRequestオブジェクトに...
-
jsでルートディレクトリより上...
-
ASP上からサーバサイドのVBScr...
-
JavaScriptでファイルの保存
-
JavaScriptによる....
-
ブラウザからエクセルを開く方法
-
node.jsでmysqlをローカル環境...
-
JavaScriptでテキス...
-
ジャバスクリプトがポップアッ...
-
Ajaxが動きません~『status=0』?
-
ローカル環境で動作しないJavaS...
-
星型評価スターレーティングの...
-
JSPの処理の途中で、JavaScript...
-
VB.NET2003 テキストボックスに...
-
計算結果が毎回違う。
-
VBAによる第3、4水準文字の判定...
-
既存のwebサイトで、ローカルの...
-
デザイン時のVisible=Falseは実...
-
if(1){...}とはどういうことで...
-
正整数の半角数字かどうか判定する
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ブラウザからエクセルを開く方法
-
JavaScriptでテキス...
-
jsでルートディレクトリより上...
-
ローカルのtest.txtを1行ずつ...
-
Ajaxが動きません~『status=0』?
-
JavaScriptによる....
-
javascriptでのmdb接続について
-
ActiveXObjectについて
-
ブラウザ上でjavascriptを編集...
-
ASP上からサーバサイドのVBScr...
-
JavaScriptでファイルの保存
-
javascriptでテキストファイル...
-
Illustrator でjavascriptによ...
-
ブックマークレットが動かない。
-
WEBブラウザから任意フォルダを...
-
星型評価スターレーティングの...
-
html組込み時のカレントフォル...
-
php -> javascript 変数渡し
-
node.jsでmysqlをローカル環境...
-
XMLHttpRequestオブジェクトに...
おすすめ情報