状態の変化がAjaxで取得できない

このQ&Aのポイント
  • Ajaxを使用してphpプログラムを呼び出し、あるディレクトリの中身を全て削除するプログラムを作成しています。しかし、実行するとファイルの削除は成功するものの、状態の変化が正しく取得できません。
  • 初回の実行ではファイルの全削除が完了と表示されますが、再実行するとディレクトリが空なのにも関わらず、再び「ファイルの全削除が完了」と表示されてしまいます。
  • この現象は、ページの更新では変化が反映されないが、新しいウィンドウで実行すると正常に変化が適用されるという状況です。この問題を解決する方法を教えてください。
回答を見る
  • ベストアンサー

状態の変化がAjaxで取得できない

Ajaxを使ってphpプログラムを呼び出し、あるディレクトリの中身を全て削除するというプログラムを組んでいます。結果をそれぞれ「ファイルの全削除が完了」「ファイルの全削除が失敗」「既にディレクトリが空」の3タイプをアラートで返すようにしています。 最初にこれを実行するとファイルが削除されるので「ファイルの全削除が完了」と返事が来ます。その後すぐにこれを再実行するとファイルを全削除した直後なので当然ディレクトリ内は空で、「既にディレクトリが空」と答えを返してくれそうなものなのですが、実際には先の返事と同じものが返ってきます。ディレクトリは空のはずなのに「ファイルの全削除が完了」と。 ページを更新しても変化はありませんが、新しいウィンドウで実行するとその変化が適用されています。これはなぜなのでしょうか?状態の変化で動作を変えるのが得意なAjaxなので、なんとか実行できて欲しいのですが・・・。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

以下の様にするといけると思います。 多分、キャシュを読みにいき新規に通信しないからだと思うので 毎回アドレスの後ろにランダムな数値を付加します。 httpObj.open("GET","****.php?ran="+(Math.floor(Math.random()*1000000000)),true);

taku17
質問者

お礼

できました!どうもありがとうございました!! >多分、キャシュを読みにいき新規に通信しないからだと思うので なるほど、そういう理由だったんですねぇ。

関連するQ&A

  • Ajaxで変数が受け取れない

    function chk() { var up_file = false; httpObj = createXMLHttpRequest(displayData); if (httpObj) { httpObj.open("POST","file_chk.php",true); httpObj.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8"); httpObj.send("chk=(ファイル名)"); } function displayData() { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { if (httpObj.responseText == "true") { up_file = true; } } } alert(up_file); } } 以上のようなソースのJavaScriptプログラムがあります。Ajaxを使ったもので、phpのプログラムでファイルの有無を調べるというものです。 まず最初に有無の確認用の変数up_fileを設定し、phpを使ったAjaxで検査、Ajaxが作動すると関数displayData()が実行され、ファイルがあればup_fileの値を初期値falseからtrueへ上書きするというものです。 ところがファイルがちゃんとあるのにup_fileの中身はflaseのままなのです。ソースにalertを書いた場所でfalseが返ってきます。その前のスコープ内に入れると、Ajaxで問い合わせるので数回falseが出た後最終的にtrueになります。なのにその1つ後のスコープ内、つまり関数displayData()を抜けた大元の関数chk()内に置くとfalseになってしまうのです。trueにする時varを使ってないのでグローバル変数の書き換えすら可能なはずなのですが・・・。 なぜ変数up_fileの上書きが出来ないのでしょうか?

  • Ajaxのエンコードで

    私はshift_JISで作成したCGIのページがあるのですが、 Ajaxを導入しようとしたときに、Ajaxというか Javascriptでは、utf-8しか認識しないととあるサイトに書いてあったのですが、 そのCGIのページをphpに変更するにはものすごく多大な時間が 必要になってしまうんですが、CGIをutf-8仕様にするのも大変です AjaxでShift_JISに変換するような事はできませんでしょうか? http://javascriptist.net/ref_prototype/ajax.periodicalupdater.html のサイトに乗っている <script type="text/javascript" src="/js/prototype.js"></script> <script type="text/javascript"> var myajax; function execute() { myajax = new Ajax.PeriodicalUpdater( "container", "./member.cgi", { "method": "get", "parameters": "id=$id", frequency: 5, // 5秒ごとに実行 onSuccess: function(request) { // 成功時の処理を記述 // alert('成功しました'); // jsonの値を処理する場合↓↓ // var json; // eval("json="+request.responseText); // ↓IEでもキャッシュを読み込まずに毎回リモート接続を実行するためのコード(パラメータの書き換え) var str = myajax.options.parameters; var hash = str.parseQuery(); hash["ajax_request_id"] = Math.random(); hash = $H(hash); myajax.options.parameters = hash.toQueryString(); }, onComplete: function(request) { // 完了時の処理を記述 // alert('読み込みが完了しました'); // jsonの値を処理する場合↓↓ // var json; // eval("json="+request.responseText); }, onFailure: function(request) { alert('読み込みに失敗しました'); }, onException: function (request) { alert('読み込み中にエラーが発生しました'); } } ); } </script> を使用して自動更新をしようと思っているのですが

  • POSTだとAjaxをループできない

    <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を使ってました。

  • jqueryのajax()内からグローバル配列に

    jqueryのajax(){success: function()内からグローバル連想配列に値を格納したい。 jqueryのajax()でhtmlファイルを読み込み配列に格納。 その後他の関数で使いたいと考えていますが グローバル連想配列に格納できません。 success: function()内でさらに関数を定義もして見ましたが反応せず。。。 (プルダウンメニューを変更したら実行する関数) 以下ソースになります。 ----------------------------------------------------------- $(function() { objectarray = new Object(); $.ajax({ type: 'GET', url: 'hoge.html', dataType: 'html', success: function(data) { var text = [];   $(data).each(function(i){ text = $(this).text().split("\n"); }); var alldata = $.grep(text, function(e){return e;});//空白やデータなしを削除 for(i=0; i<alldata.length; i++){ objectarray[i] = (alldata[i]); alert("forの中" + objectarray[i]);//取得できた } alert("forの外" + objectarray);//取得できた return objectarray;//あってもなくても変わらない。。。 }, error:function() { alert('問題がありました。htmlデータがありませんでした。'); }             //return objectarray;←有効にするとjsが認識されなくなります。 }); alert("ajaxの外" + objectarray[0]);//何も表示されない、firebugでみるとobjectarrayには値が入っている。 }); ----------------------------------------------------------- 上記はnew Object()でやっておりますがnew Array()でも同じ結果でした。 回避策をご教授いただけましたら幸いです。 どうぞよろしくお願いいたします。

  • Ajaxを使った読み込みができない

    ●質問の主旨 Ajax(非同期通信)を使って、 ブラウザ上でテキストファイルの読み込みを させたいのですが、できません。 Ajaxにお詳しい方、ご指導願います。 ●質問の補足 HTML5とjqueryの技術を使って、 テキストファイルの中身(Hello,World)の 読み込みをさせたいと考えております。 参考サイトにもとづいてやってますが、 画像の表示ができません。 表示させるためにはどうしたら良いでしょうか? ●コード <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>jQueryの練習</title> <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script> </head> <body> <h1>jQueryの練習</h1> <div id="main"></div> <input type="button" id="kick_ajax" value="Ajax!"> <script> $(function() { $('#kick_ajax').click(function() { $('#main').load('contents.txt', function() { alert('読み込み終了!'); }); }); }); </script> </body> </html> ●テキストファイルのファイル名 contents.txt ●参考サイト(ドットインストール) http://dotinstall.com/lessons/basic_jquery/519

    • ベストアンサー
    • AJAX
  • ファイルの中身を消したい場合のコマンド(Bシェル)を教えてください

    シェルでファイル(textファイル)の中身を削除したいのですが、 Googleで調べても、「ファイル・ディレクトリの削除」のコマンドはあるのですが、「ファイルの中身の削除」の方法がわかりません。 ファイルの中身を空にして、空のファイルだけを残しておく方法は無いのでしょうか? また、空になったファイルが存在できないのなら、ある文字(たとえば'a*.a')をファイルの内容として書いておきたいと思います。 どうぞ宜しくお願いいたします。

  • フォルダが削除できないです

    このカテゴリーで良いのか分からないですが近いと思うのでこちらに書かせていただきます。 先日ZIPファイルを中身確認のため解凍し、解凍されたフォルダを開き中身を確認しました。 今回の目的は"中身の確認"だけでしたので解凍されたフォルダを削除しようとDeleteキーを押しました。 しかし削除が実行されず、"このファイルはほかの人物またはプログラムに使用されています。停止してから再び削除をしてください"というような内容のアラートが表示されます(このPCは英語OSのためアラートは英語)。 そのフォルダにはいくつか階層があり、中のフォルダとファイルはあるひとつを除いては削除が可能でした。 隠しファイルがあるか調べた結果、その中にはプログラムファイル(?)がひとつ入っており、これが原因か?と思い削除しましたが状況は変わらず、といった感じです。 ちなみに読み取り専用ファイルとなっています。変更はできなかったです。 質問は どのようにしたらこのフォルダを削除できるか、またなぜ削除できないのか という2つです。 回答の方よろしくお願いします。

  • ゴミ箱アイコンが変化しない

    ゴミ箱に不要ファイルを捨てて、右クリックで「ゴミ箱を空にする」を選ぶと、ファイルが消去されゴミ箱の中身は空になるのですが、アイコンが変化しません。逆にゴミに不要ファイルを移動してもアイコンが変化しません。 デスクトップ上で右クリックして「最新の情報に更新する」をすればアイコンが変化することは知っているのですが、それをすることなくアイコンがちゃんと自動で変化するにはどうしたら良いのでしょうか? OSはVsitaです。よろしくお願いいたします。

  • Windowsでファイルを無理矢理 消去するには?

    Windowsで、あるファイルを消したいのですが、 再起動直後にエクスプローラから、「ファイルの削除」しても、 「別のプログラムがこのファイルを開いているので、操作を完了できません。ファイルを閉じてから再実行してください。」 と出て、消去出来ません。 無理矢理に消去する方法はありませんか?

  • どこまでがAjaxなの?

    現在、Ajaxを勉強中の初心者です。 質問のタイトル通りなのですが、どこまでがAjaxなのかイマイチわかりません。 AjaxはJavaScript + XMLで非同期通信をする技術ですが 1.画像やプログラムファイルをサーバPC側に入れておいてクライアントPC側でラジオボタンの選択によって画像表示を変えるのはAjaxですか、それともただのJavaScriptですか? 2.サーバを使って以下のような入力可能文字カウンタを表示させるのはAjaxですか、それともただのJavaScriptですか? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>文字のカウント</title> </head> <body> <form>   <textarea cols="46" rows="5" id="title1" name="title1" size="50"></textarea><br />   あと<span id="inputlength1">20</span>文字入力できます<br /> </form>   <script type="text/javascript"><!--     function lengthCounter (node, max, cut) {       max = max || Number (node.maxLength) || 20;       return function () {         var rest = max - node.value.length;           if (rest < 0) {             if (cut) {               alert ('20文字以内にしてください');               rest = max;               node.value = node.value.substring (0, max);             }           }           return rest;       };     }     function dispValue (node, cbFunc) {       return function () {         node.firstChild.nodeValue = cbFunc ();   };     }     setInterval (dispValue ( document.getElementById ('inputlength1'),     lengthCounter (document.getElementById ('title1'), 20, true)), 100);   // --></script> </body> </html> 3.「googleサジェストのインクリメンタル検索にはAjaxの技術が利用されている」←ここでのAjaxにはPHPも含まれますか? 私はPHPをAjaxの枠には入れないような気がします。正確にはPHPとAjaxでインクリメンタル検索機能がつくられていると思うのですが。 4.PHPのみでAjaxと同じ非同期通信ができればそれはAjaxと呼ぶのか? よろしくお願いします。

    • ベストアンサー
    • AJAX

専門家に質問してみよう