<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=shift_jis">
<title>Ajax</title>
<script type="text/javascript">
<!--
function createXMLHttpRequest(cbFunc) {
XMLhttpObject = new XMLHttpRequest();
if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;
return XMLhttpObject;
}
function func() {
for (i=0; i<5; i++) {
httpObj = createXMLHttpRequest(displayData);
if (httpObj) {
httpObj.open("GET","file_chk.php?chk=(ファイル名)",true);
httpObj.send(null);
//httpObj.open("POST","file_chk.php",true);
//httpObj.send("chk=(ファイル名)");
}
}
}
function displayData() {
if ((httpObj.readyState == 4) && (httpObj.status == 200)) {
alert(httpObj.responseText);
}
}
// -->
</script>
</head>
<body>
<input type="button" value="Ajax" onclick="func();" />
</body>
</html>
先の投稿と似たものになってしまいますが、以上のようなソースのプログラムを組みました。ボタンを押すとAjaxが作動してphpプログラムを呼び出し、その結果を返すというものです。phpプログラムは任意のファイル名を変数として受け取り、その存在の有無によって返事を返すというものです。ソースは以下の通りです。
<?
$file = $_GET['chk'];
//$file = $_POST['chk'];
if (file_exists($file)) {
print "true";
} else {
print "false";
}
?>
このAjaxで問い合わせるという処理全体をループさせたいのですが、コメントアウトしているPOSTで実行するとうまくいきません。1回しかアラートが出なかったり、5回と設定してるのにそれ以上出たり。当初これに悩まされてましたが、GETで試すとうまくいきました。なぜPOSTだとうまくいかなかったのでしょうか?自分なりに考えてみたのですが全く分かりません。ソースのもので試すときは一方のコメントアウトを外し、他方をコメントアウトさせていました。もちろんphpの方も同様です。
GETとPOSTで書いたソースは間違ってませんよね?同じ意味になってますよね?どちらの方法でもいいことはいいんですが、GETだと与えるクエリによっては行が横に長くなってしまいますし、sendがあるのならそこに変数を書いたほうが見やすいのではないかと思ってPOSTを使ってました。
No.1ベストアンサー
- 回答日時:
post送信の時は、RequestHeaderも送らないとなりません。
open()とsend()の間で、httpObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
などとします。
参考url 以下のサイトが解りやすいかと思います。
送信部分のブラウザ別対処法もしっかりしているので、私もライブラリを使わせて貰っています。
http://allabout.co.jp/career/javascript/closeup/ …
参考URL:http://allabout.co.jp/career/javascript/closeup/ …
No.2
- 回答日時:
> 1回しかアラートが出なかったり、5回と設定してるのにそれ以上出たり。
open()、send()の度に、実際にはonReadyStateChangeが実行されています。(これはXMLHttpRequestオブジェクトの仕様による物です)
変数の使い回しにより、
send()が完了しreadyStateが4、statusが200のまま、
再度openしたりオブジェクトを作り直しすると、onReadyStateChangeによりdisplayData()が呼び出され、
5回以上呼び出されることがあります。
また、open前のreadyStateが0の状態で作り直しすると、displayData()が実行される前にオブジェクトが破棄されますから、1回だけしか実行されないなどの状態になります。
対処方法は配列にするなどして、5回実行されることを保証する様にしてください。
function createXMLHttpRequest() {
XMLhttpObject = new XMLHttpRequest();
return XMLhttpObject;
}
function func() {
for (i=0; i<5; i++) {
httpObj[i] = createXMLHttpRequest();
if (httpObj[i]) {
httpObj[i].onreadystatechange = displayData;
(略 ANo.1参照)
}
}
}
function displayData(obj) {
if (obj.readyState != 4){
return;
}
if(obj.status == 200 || obj.status==304)) {
alert(obj.responseText);
}
}
キャッシュファイル対策もつけています。
メジャーな方法に
URLの後ろに日付をつけるとか、If-Modified-Sinceヘッダをつけるなどして、常に最新のデータを取り直す様にする方法がありますが、
必ず最新のデータでなければならないというのでなければ、
サーバーの負担になるので私はお勧めしません。
displayDataには引数としてXMLHttpRequestオブジェクトが与えられますので、それを使っています。
IE6、IE7の特定の設定時の対策は省略。
ライブラリを使う場合の配列化の必要性はわかりません。
ライブラリのドキュメントやソースコードを見て下さい。
動作未確認。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1つのVBAコードをすべてのコア...
-
JSPの処理の途中で、JavaScript...
-
jQuery ui Datepicker 明日以降...
-
javascriptでsjisの文字列からu...
-
初心者です。gulpでコンパイル...
-
2回目のSortメソッドが失敗~20...
-
innerHTMLなどの反映タイミング
-
〔Excel:VBA〕マクロの実行が異...
-
VBA ステータスバー DoEvents
-
Excelのマクロ一括実行ができな...
-
$(document).readyとloadの違い
-
eachメソッド_JQueryで質問です><
-
if(1){...}とはどういうことで...
-
JavaScriptでショートカットキ...
-
計算結果が毎回違う。
-
PowerPointで時計表示
-
VBA SORT Applyでエラー
-
デザイン時のVisible=Falseは実...
-
ACCESS(VBA)の検索結果判定に...
-
onload onunload onbeforeunloa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
初心者です。gulpでコンパイル...
-
if(1){...}とはどういうことで...
-
C#でボタン名を変更しても動く
-
VBA ステータスバー DoEvents
-
デザイン時のVisible=Falseは実...
-
PowerPointで時計表示
-
〔Excel:VBA〕マクロの実行が異...
-
1つのVBAコードをすべてのコア...
-
既存のwebサイトで、ローカルの...
-
innerHTMLなどの反映タイミング
-
VBA SORT Applyでエラー
-
Excelのマクロ一括実行ができな...
-
resizeToメソッドが動作しません
-
JavaScriptでショートカットキ...
-
jQuery ui Datepicker 明日以降...
-
CTRL + Xを無効にしたい
-
アクセスのフォームでタイマー...
-
javascriptで最初のところに戻...
-
リクエスト結果が一瞬しか表示...
おすすめ情報