• ベストアンサー

ajaxでtxtを取得する

基本的なことかもしれませんが、質問します。 prototypeのライブラリを使ってajaxに挑戦しています。 ******************** var D = { method : "get", onSuccess : function(){...} }; new Ajax.Request("dara.txt", D); ******************** この方法だと、キャッシュ(?)を読み込んでしまうのか、 cgiでの変更点がすぐに反映されてこないので、このようにしました。 ******************** var D = { method : "get", parameters : "n=" + Math.random(), //←ここを追加 onSuccess : function(){...} }; new Ajax.Request("dara.txt", D); ******************** これで、毎回ちゃんとサーバーから読み込むようになりましたが、 このスクリプトを実行するたびにインターネット一時ファイルに保存されるので、 ものすごい数のテキストファイルが保存されてしまいます。 毎回サーバーから読み込んで、且つ、一時ファイルに残さない方法をご存知の方は、ご教示願います。

  • AJAX
  • 回答数3
  • ありがとう数11

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

  • ベストアンサー
  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

> cgiでの変更点がすぐに反映されてこないので これはCGIが吐き出すテキストファイルをAjaxで取得しようとしているのでしょうか? Ajaxでファイルを取得する場合、基本的にファイルは固定された(動的に変更されない)内容だと思います。 ちなみにFirefoxのFirebugでテキストファイルを取得した場合のXMLHttpRequestを確認してみましたが、確かに1度取得してからある程度(数十秒)時間が経過しないと通信が行われませんね…。 もし動的に変更されるテキストファイルを取得しようとしているのであれば、URLにファイル名を指定するのではなくtext/plainレスポンスを返すCGIを作成してそのCGIに対してAjax通信を行ってはどうでしょう?

kura07
質問者

お礼

そのようにしてみます。 ところで、レンタルサーバーを使っているので、 cgiで返って来るテキストに広告が自動挿入されてしまうのですが、 ~広告~ <!-- ajax -->テキストテキスト<!-- /ajax --> ~広告~ と出力したものを、 data.responseText.match(/<!-- ajax -->(.*)<!-- /ajax -->/); var str = RegExp.$1; とすれば、問題ないですよね? (data.responseTextは返ってきたテキストを指しています。)

その他の回答 (2)

回答No.3

クライアントからはIf-Modified-Sinceヘッダを出し、 サーバーからはLast-ModifiedヘッダやPragmaなどのヘッダ(キャッシュコントロール)を出すようにすればURLを変えずにキャッシュ制御が出来ます。 URLを変更してキャッシュコントロールするのは、 サーバーのキャッシュコントロールが通常は出来ない事と、 (一般のレンタルサーバーではインストールされていない機能を使うか、 CGIを使わないと行けない) 一部のAjax対応の古いブラウザではキャッシュコントロールを無視するためです。 prototype.jsにキャッシュコントロールのインターフェースがなければ、 If-Modified-Sinceヘッダは自分で付加しないと行けないです。 > このスクリプトを実行するたびにインターネット一時ファイルに保存されるので、 > ものすごい数のテキストファイルが保存されてしまいます。 どうせいろんなページを回っていればそれだけファイルが保存されますから、 数万個程度なら無視できるレベルだと思いますが?

kura07
質問者

お礼

回答ありがとうございます。 If-Modified-Sinceとか良くわからないので、自分で調べてみようと思います。 >数万個程度なら無視できるレベルだと思いますが? それもそうかもしれません…。

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

Ajaxで取得しているのは「テキストファイル」ですか? それとも「CGIが出力するtext/plainレスポンス」ですか? もう1点、onSuccessでの関数の処理は何をしていますか?

kura07
質問者

補足

テキストファイルです。 onSuccessでは、第一引数に入っているオブジェクトの.responseTextを参照しています。

関連するQ&A

  • prototypeでajaxをする時に、onSuccessで指定した関数の戻値を取得する方法

    こんにちは、Ajax初心者です。 prototypeでAjaxをする時に、 new Ajax.Request(url, { method: 'get', onSuccess: getDat, onFailure: showErrMsg, parameters: paramList }); と言う風に書きますが、通信が成功した時に実行されるonSuccessのgetDataと言う関数の戻値を取得したいのですが、どうすればよいのでしょうか? 自分なりに調べてみると、prototypeのbindを使えばいけそうな感じなのですが、bindの使い方も良く分かりません(いろいろ調べてみたのですが、、、)。どうか詳しい方お願いします。

  • prototype.jsのAjax.Requestでeventを引数にしたのですが

    prototype.jsのAjax.Requestといつ便利な関数がありますが onComplete時の引数にeventオブジェクトを設定したらIE7では eventオブジェクトが引き継げませんでした。 たとえばこのようなメソッドで function ajax_request(url, params, method, ele1, ele2){ var nt = new Date(); var pr = params + "&nt=" + nt.getTime(); var a = new Ajax.Request( url, { method: "get", parameters: pr, onComplete: function(request){ method(request, ele1, ele2); } } ) }; ele1にeventオブジェクトを設定し、methodを実行しても デバックで、ele1.typeが何も表示されませんでした。 firefox2.0だと「click」など正しく表示もされオブジェクトが引き継がれておりました。 何が問題なのでしょうか?それともIE7ではeventオブジェクトを引き継ぐことは出来ないのでしょうか?

  • 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> を使用して自動更新をしようと思っているのですが

  • Ajax.Requestで?を含むパラメータがPOSTできなくて、困っています

    はじめまして、ajaxはほとんど初心者です。 早速質問させていただきます。 javascriptで var paramList = "link=aaa?bbb"; new Ajax.Request(url, { method: 'post', onSuccess: getData, onFailure: showErrMsg, parameters: paramList }); と入力して $_POST["link"]でパラメータを受け取ろうとしても、うまく受け取ることができません。 var paramList = "link=aaabbb"; として試してみたらうまく受け取れたので、 おそらく?に何かあると思い調べてみたのですがよくわかりませんでした。 "aaa?bbb"という文字列をそのままpostする方法はあるのでしょうか? わかる方がいらっしゃったら回答をよろしくお願いします。

  • Ajaxから画像ファイルへのリクエスト

    こんにちは。 現在、prototype.jsを使用してAjaxについて勉強をしています。 【質問】 画像ファイルへAjax.Requestを使用してリクエストを送信した場合、JavaScriptでは受信したバイナリデータを扱う事は出来ないのでしょうか。 【サンプルコード】 new Ajax.Request("hoge.gif", { method: "get", onSuccess:function(httpObj){ var body = httpObj.responseBody; } }); ※ 変数bodyにバイナリデータが入っていると思ってます。 色々調べて周ってみたのですが、画像等のバイナリファイルへリクエストを送信している様な例が無かったので、Ajaxでの通信はテキストデータのやりとりを前提としているのかなと、勝手に予測してみたのですが、どうなんでしょうか。 下記サイトでHttpRequestオブジェクトについて調べてみても、MIMEを取って来れなさそうだったので、やはり扱え無いのかなと思いました。 http://www.devguru.com/Technologies/xmldom/quickref/obj_httpRequest.html あと、余談ですが上記サンプルコードの変数bodyをtypeof()に渡すとunknownになるのですね。。。(IE6) 質問は以上です。 どなたか、暇な時にでもご回答頂ければ幸いです。

  • 【javascript文法】 prototype.js Ajax.Request onSuccess:に指定するfancitonの書き方

    以下HTMLは開いた時に'2'がアラート、続いて'hello world'がアラートされるものです。 動作的には期待どおりに動きますが、記述方法に難を感じています。 課題としては、Ajax.RequestのonSuccess:に指定するfancrionをprototypeを使って 宣言したfunctionで且つ、引数を与えたいです。 (Ajax.Requestが返してくる引数も使いたい。) 表現が下手ですみません。 ※行頭は全角スペースです。実際に機能させる為には  半角に修正もしくは行頭スペースは削除して下さい。 <html> <head> <script type="text/javascript" src="prototype.js"></script> <script type="text/javascript"><!-- function http(){  this.val=1; }; http.prototype.request = function(){  var url="/ruby/hello.cgi"; //実際に検証する為にはwebサーバにこのcgiを置く必要あり  new Ajax.Request(url, {   method:"get",   onSuccess: function(h){r.processRequest(h,1);}   /* ↑http.prototype.requestの中なので、r.ではなくthis.processRequest(h,1)と記述したい*/  }); }; http.prototype.processRequest = function(h,arg){  alert(this.val+arg);  alert(h.responseText); }; var r = new http(); r.request(); //--></script> </head> <body></body> </html> 以下"/ruby/hello.cgi"の例 #!/usr/bin/ruby puts "Content-Type: text/html\n\n" puts "hello world" ※実際に実行する場合はprototype.jsが必要です。 これで、期待通りの結果が得られるのですが、コメントに記載したように、 http.prototype.request = function()の中でonSuccess:に指定する関数が、 this.と記述できず、r.と記述しないと動作しません。 http.prototype.request = function()の中で、 ~~~~~~~~~~~~~~ http.prototype.processRequest = function(h,arg) ~~~~~~~~~~~~~~ を使うのですから、 r.processRequest(h,1)ではなく、 ~ this.processRequest(h,1) ~~~~ と記述したいです。 因みに同じような質問を http://oshiete1.goo.ne.jp/qa4663141.html でしており、この『応用』だとも思うのですが、名案浮かばずです。 このような場合、どう記述するのがベターなのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • AJAX
  • Ajax データが取得できない

    現在、AJAXを勉強中です。以下のhtmlを実行し、pref.jsを呼び出すコードをサイトから引用して記述しました。 しかし、「データを取得する」ボタンを押すと、【処理中です・・・】というメッセージが出るだけで、いっこうに該当データを取得できません。(本来であれば、指定されたxmlファイル内のデータが表示されるはずなのですが・・) 何が原因なのでしょうか。 解決策がわかる方がいらっしゃいましたらご教授ください。 よろしくお願いします。 ■pref.html --------------------------------- <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="../lib/prototype.js"></script> <script type="text/javascript" src="pref.js"></script> <link href="pref.css" rel="stylesheet" type="text/css"> <title>pref</title> </head> <body> <div> <input type="button" id="btnData" value="データ取得" /> <input type="button" id="btnClear" value="クリア" /> </div> <div id="state"></div> <div id="result"></div> </body> </html> --------- ■pref.js ---- onload = init; var state; var result; function init() { $("btnData").onclick = prefDisp; $("btnClear").onclick = clearDisp; state = $('state'); result = $('result'); } function prefDisp() { state.innerHTML = "処理中です・・・<br />\n"; var url = "http://ws.bzen.net/pgtop/pref.xml"; var paramList = ""; new Ajax.Request(url, { method: 'get', onSuccess: getData, onFailure: showErrMsg, parameters: paramList }); function getData(data){ var response = data.responseXML.getElementsByTagName('Response'); var item = response[0].getElementsByTagName('Item'); var tmpHtml=""; for(i = 0; i < item.length; i++){ var prefCd = item[i].getElementsByTagName('PREF_CD'); var prefCdValue = prefCd[0].firstChild.nodeValue; var prefName = item[i].getElementsByTagName('PREF_NAME'); var prefNameValue = prefName[0].firstChild.nodeValue; tmpHtml += prefCdValue + " " + prefNameValue + "<br />\n"; } result.innerHTML = tmpHtml; state.innerHTML = "データを取得しました。<br />\n"; } function showErrMsg(){ clearDisp(); state.innerHTML = "データを取得できませんでした。<br />\n"; } } function clearDisp() { state.innerHTML = ""; result.innerHTML = ""; } ---

    • ベストアンサー
    • AJAX
  • AJAXチャット

    AJAXを利用したチャットを作っています。 Prototype.jsの.PeriodicalUpdaterを使って定期的にリロードすると同じ情報が繰り返し表示されてしまいます。 例えば ------------------------ 名前:aaa コメント:テスト ----------------------- とフォームに入力すると、 この情報がPeriodicalUpdaterで指定した秒数ごとに増えていってしまいます。。。 改善策を教えてください。 JavaSciriptの部分 function chat() { // パラメータを作成 var parameter = "name=" + $F('name').escapeHTML() + "&" + "email=" + $F('email').escapeHTML() + "&" + "comment=" + $F('comment').escapeHTML(); // Ajax.Updaterオブジェクトを作成 var myAjax = new Ajax.Updater( 'placeholder', // 差し込む要素 'test.php', // 呼び出し先のURL { method: 'post', // メソッド postBody: parameter, // ポストされるボディ部 } ); var myajax = new Ajax.PeriodicalUpdater('placeholder', 'test.php', {postBody: parameter,frequency: 10}); } postでサーバに送信してPHPで受け取ってます。 JavaScriptはフォームの送信ボタンによって呼び出されます。

  • JSONのデータから商品名の取得の仕方

    今現在下記の記述でJSONを取得しています。 ===== <html> <head> <title>JSONのデータを使ってみる</title> </head> <script type="text/javascript" src="./prototype.js"></script> <script type="text/javascript"> function execute() { var url = './ItemSearch_json.php'; var paramList = "keyword=" + encodeURIComponent("ふくろう"); var a = new Ajax.Request( url, { method: 'get', parameters: paramList, onSuccess: function(request) { // alert('読み込み成功しました'); // jsonの値を処理する場合↓↓ var json; eval("json="+request.responseText); }, onComplete: function(request) { alert('読み込みが完了しました'); $('container').innerHTML = request.responseText; // jsonの値を処理する場合↓↓ var json; eval("json="+request.responseText); }, onFailure: function(request) { alert('読み込みに失敗しました'); }, onException: function (request) { alert('読み込み中にエラーが発生しました'); } } ); } </script> <body> <div id="container">content</div> <button onclick="execute()">サンプル実行</button> </body> </html> ===== このままだと、プレーンテキストは表示されるのですが、商品名や価格の一覧などを選択して表示できません。 evalなどを使うのかなと思うのですが、はっきり分かりません。 ヒントを教えていただけないでしょうか。

    • ベストアンサー
    • AJAX
  • ajaxでエラー処理

    お世話になります。 prototype.jsを使ってajaxのエラー処理を考えております。 そこで質問なのですが、以下のソースで OK.phpでは正常に処理が行われ、 NG.phpでは強制的にonFailure処理を行わせたいと考えております。 PHP側(NG.php)で、操作出来ませんでしょうか? よろしくお願いいたします。 <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script type="text/javascript" src="prototype.js"></script> <script type="text/javascript"> <!-- function ajax(fName) { var filename = fName + "?cache="+(new Date()).getTime(); new Ajax.Request(filename, { method: "get", onSuccess: displayData, onFailure: displayError }); } function displayData(httpObj) { $("result").innerHTML = httpObj.responseText; } function displayError(httpObj) { $("errMsg").innerHTML = httpObj.responseText; } // --> </script> </head> <body> <input type="button" value="正常処理" onClick="ajax('OK.php')"><br> <input type="button" value="エラー処理" onClick="ajax('NG.php')"><br> <div id="result"></div> <div id="errMsg"></div> </body> </html>