jQueryのAjaxで通信の途中結果を取得したい

このQ&Aのポイント
  • jQueryのAjaxを使用して通信結果を受信する方法について教えてください。
  • 通信先のphpが発行するhtmlの途中結果を受信する方法を教えてください。
  • 通信中に生成されたhtmlの途中結果を受信して表示する方法を教えてください。
回答を見る
  • ベストアンサー

jQueryのAjaxで通信の途中結果を取得したい

jqueryのajaxを使って通信先のphpが発行するhtmlを受信して受信側の<div id="data"></div>に 表示させているのですが、通信先のphpが処理して生成したhtmlの途中結果を受信して 表示させるにはどのようにすれば良いのでしょうか? 例えば通信先のphpを <?php ob_start(); for ( $i = 1; $i <= 100000; $i++ ) {  if ($i % 100 == 0) {   echo "■";  }  @ob_flush();  @flush();  usleep(30000); } ?> このようにして受信側を <div id="data">■■■</div> というようにプログレスバーみたいに次々と■を増やしていきたいのですが、実行してみると最終結果の <div id="data">■■■■■■■■■■■■■■■■■■■■■■■■(…省略)</div> だけが出力されてしまいます。 どのようにすれば良いのか教えて頂きたいです。 どうぞよろしくお願い致します。

  • suffre
  • お礼率76% (2013/2633)
  • AJAX
  • 回答数2
  • ありがとう数1

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

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

一応、補足。 CGIを使わない静的なファイルであればApacheなどのウェブサーバーが自動的にcontent_lengthを計算してくれますが、 動的な生成ではプログラム終了まで送出サイズがわからないため、content-lengthが計算できません。 そのため、自分で計算する処理を入れなければなりません。 CGI(PHP)からcontent-lengthを送出する方法ですが、以下のような考え方で行ってください。 バッファにすべてのデータを貯めておく。   global $buffer;   $buffer='<div id="data">';   $buffer.='■';   $buffer.='</div></html>'; バッファサイズを測り、ヘッダを生成する   $bytes=strlen($buffer);   header('content-length: ' . $bytes); データを送出する。   echo $buffer; --------------------- もう一つの方法として、Comet(ロングポーリング)を使う方法があります。 PHP側の処理をsleepさせずに、一旦終了させます。 その後JavaScriptで通常のonreadystatechangeの処理(受信完了処理)を行い、直後(または一定時間おいて)にもう一度サーバーにアクセスします。 こうする事で、アクセス完了処理が何回も行われる事になりますので、(擬似的な)リアルタイム更新が可能になります。 詳しくは「ajax comet」で検索してみてください。 クライアント側で一定時間待機後にアクセスする通常のポーリング (<meta name="refresh" content="10">のAjax版) なら、Cometほどサーバー負荷はありません。 こちらの方がよく使われます。 チャットルームなどがこのポーリングです。 Twitterの「新しい発言」が自動的に増えていくのとか、スクロールするごとに次ページの内容が表示されていくというのも、 画面に追加するという点ではポーリングと変わりありません。 ぶっちゃけ、単発のAjax通信は「Ajax」と呼ぶに対して、連続するAjax通信に違う名前を付けただけです。 ----------------- 純粋な双方向通信を行う方法 ブラウザもサーバーも、両方が対応している必要がありますが、WebSocketを使用する方法があります。 要はブラウザが行っている通信行程を全てJavaScriptで記述し、 サーバー側のプログラムは、Apache(Apache上で動くものではなく、Apacheそのもの)を作るような物です。 そのため、一般のレンタルサーバーでは使えません。 「websocket」で検索してください。

その他の回答 (1)

回答No.1

XMLHttpRequest2であれば、 .onprogressイベントハンドラで処理すれば、通信途中の状況を取得する事が出来ます。 (ブラウザが対応していれば) http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html#firing-events-using-the-progressevent-interface-for-http ProgressEventインターフェースで受け取れるのは受信バイト数、総バイト数のみです。 総バイト数はおそらくcontent-lengthヘッダだと思います。 そのため、CGI等から出力する場合でcontent-transfer-encodingヘッダがchunckedになっていると、content-lengthヘッダを生成できなかったりchunkのバイト数だけになっていることがあるため、総バイト数が0になるか非常に不安定、または常にtotalとloadedが同じ値になると思います。 jQueryはプラグインでonprogressに対応しているようです。 https://github.com/kpozin/jquery-ajaxprogress 探せば同様のプラグインが他にもあるかもしれません。 質問文のような、PHPの出力を逐次出力するという事はできません。(サーバーから受信したデータを受け取るプロパティがないため。) バイト数から■の数を計算し、出力してください。

suffre
質問者

お礼

お教え下さってありがとうございます。 >質問文のような、PHPの出力を逐次出力するという事はできません。 そうなのですね。なんとなくできないだろうな…とは思っていたのですが…。 教えていただいた件ですが、自分には未知の部分が多く、これから勉強する上での 指標とさせて頂きたいと思います。 そのため、詳しくお返事できないことをお許し下さい。 ただ実現に向けて実行していくことは確かです。 そのとき再びわからないことがありましたらまた質問させて頂きたいと思います。

関連するQ&A

  • jQuery Ajax通信をランダムで表示

    Ajax通信で別htmlファイルを読み込みたいと考えています。 それぞれ読み込むファイルは、a.html、b.html、c.html、d.htmlとあります。 読み込む先(index.html)の以下div要素内に、 上記htmlを読み込みたいと考えています。 <div id="01"></div> <div id="02"></div> <div id="03"></div> <div id="04"></div> 本来ならAjax通信で以下のように出来るかと思います。 $(function(){  $('#01').load('a.html');  $('#02').load('b.html');  $('#03').load('c.html');  $('#04').load('d.html'); }); しかし、div要素内の表示をランダムにしたいのです。 例)id="01"のところに、b.htmlだったり、d.htmlだったりという感じです。  ロードする度にコンテンツの表示場所が変化するイメージです。 ランダムというところが、どのように対処したらよいのか、手も足も出ません。 どなたか詳しい方、ご教授いただけたら助かります。 何卒、何卒、宜しくお願いいたします。

    • ベストアンサー
    • AJAX
  • jQuery Ajaxでクロスドメイン通信

    jQuery Ajaxでクロスドメイン通信をやりたいのです以下の質問について教えて下さい。 AjaxからPHP(別ドメイン)にデータをPOSTで投げたいです。 PHPファイルがあるディレクトリはBasic認証してあります。 質問1. AjaxのdataTypeオプションは、PHPからjQueryが受け取るレスポンスのデータタイプのことですか? それともjQueryからPHPからにデータを投げる場合にもこのタイプ指定で何か変わるのでしょうか? 質問2. クロスドメイン通信をdataTypeがjsonpじゃないとクロスドメイン通信はできないのでしょうか? 質問3. dataTypeがjsonpのとき、jQueryから投げるURLの末尾に?data=hogehogeのようにパラメータが付きます。 typeオプションをPOSTにしているのにGETのようにパラメータが付くのはなぜでしょうか? これのせいで、数千文字のパラメータをPOSTできずGETの文字数制限でエラーになってしまいます。 どれは一つでもおわかりでしたらお教え下さい。 よろしくお願い致します。

  • jQueryでajax

    ajax(jQuery使用)を使った以下のサンプルは、 セレクトボックスを選択すると、ボタンを表示するのですが、 そのボタンをクリックしても、アラート(This is success!)が表示されません。 ajaxで吐き出した<button>ボタン</button>のボタンのクリックイベントが 検知しないような感じですが、いったいどこが間違っているのかわかりません。 どなたか、ご教授いただけると助かります。 htmlソース ------------------------------------------- <meta http-equiv="content-script-Type" content="text/javascript" /> <meta http-equiv="content-style-Type" content="text/css" /> <link rel="stylesheet" href="./photo.css" media="all" /> <title> テスト</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("button").click(function() { alert("Test is success!"); }); $(".first").change(function() { var param = ''; $.ajax ({ type: "POST", url: "ajax.php", data: param, cache: false, success: function(res) { $("#result").html(res); } }); }); }); </script> </head> <body> <select name="first" class="first" id="first"> <option value="1">項目1</option> <option value="2">項目2</option> </select> <p>結果:</p> <div id="result" style="width:808px;"></div> </body> </html> phpソース ---------------------------------------- <?php echo '<button>ボタン</button>'; ?>

    • ベストアンサー
    • AJAX
  • JQueryでAjax通信をキャンセルした時につて

    JQueryでAjax通信時に、abort()でキャンセルを行うと通信はキャンセルになっているようですが、 サーバー側(Ajaxで呼ばれた処理)は、最後まで処理されてしまいます。 abort()を実行させた時に、サーバー側の処理まで中断させる方法はありますでしょうか? 実行と中止は以下のような感じで書いています。 Ajax実行 arrXhr = $.ajax({ dataType: "json", type: "POST", url: "xxxxxxx.php", async: true, cache: false, data: sendData, success: function ( data ) { }, error: function ( XMLHttpRequest, textStatus, errorThrown ) { } }); 中止 xhr.abort();

  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • jQueryでAJAXを利用しJSONデータを取得

    商品コードを入力したら、AJAXで商品名と価格を取得して表示させ、それを確認して個数を入力して注文票を作ろうとしています。 商品名だけの取得は何とかできたのですが、商品名と価格といったように複数データを取得するのに苦労しています。 独学のプログラミングなので初歩的な所が分かっていないのだろうと思いますが、JSON形式で受け取ればいいのだろうと考えて、そうしているのですが、うまくいきません。 下記は、商品名だけなら取得できているコードですが、どこを修正したらいいでしょうか。 よろしくお願いします。 ファイル名:test1.php <html> <head> <title>test</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"></script> <script type='text/javascript'> $(document).ready(function(){ $("#goodsid").keyup(function(e){ var search_val=$("#goodsid").val(); $.post("./SubTest1.php",{search_term : search_val},function(data){$("#goodsname").html(data);}) }) }); </script> </head> <body> <form id="searchform" method="post"> <div> <label>商品番号</label> <input type="text" name="goodsid" id="goodsid" /> </div> </form> <div id="goodsname"></div> <div id="goodsprice"></div> </body> </html> ファイル名:SubTest1.php <?php ini_set("default_charset","utf-8"); // MySQLクラスファイルの取り込みとインスタンスの作成 require_once("../mysql.php"); $mysql = new MySQL; $term = $_POST["search_term"]; $sql = "SELECT goods_name,goods_price FROM `goods_table` WHERE goods_num ='".$term."'"; $mysql->query($sql); $row = $mysql->fetch(); // ここまででデータを取得している if ($row){ $goodsname = $row['goods_name']; }else{ $goodsname = ""; } echo $goodsname; //呼び出し元のtest1.phpに返す値 ?>

  • jQuery・Ajaxについて教えて下さい。

    jQueryを使用した「Tipped」というツールチップ作成フレームワークを使用しています。 「ツールチップの上にさらにツールチップを表示する」ということが出来ず困っております。 ドキュメント http://projects.nickstakenburg.com/tipped/documentation 特定のクラス名の文字にカーソルを当てると、Ajaxにより外部HTML(PHP)の内容が小窓で表示されるというものです。 これを使って外部HTMLの表示をすることはできたのですが、 ツールチップ内に表示されるHTMLの中にさらに同名のクラス名を埋め込み、 そこにカーソルを当てたとき二重(入れ子)でツールチップを表示するということをしたいのですが、 最初の1つしか表示されません。 ■読み込む側(A.php) ~ 必要なファイルの読み込み ~ <span class='tipped' data-tipped='B.php'>カーソルを当てると「B.php」の内容を表示</span> <script type="text/javascript"> jQuery(document).ready(function() { Tipped.create(".tipped", { ajax: true }); }); </script> ~ ■読み込まれる側(B.php) <span class='tipped' data-tipped='C.php'>ここにカーソルを当てて「C.php」の内容を表示させたい</span> A.phpからB.phpのツールチップを表示することはできました。 B.phpからC.phpのツールチップを表示することもできますが、 A.phpに表示したB.phpからはC.phpのツールチップが表示できません。 Ajaxを使わず、B.phpに静的なツールチップを埋め込んだ場合も表示できませんでした。 wordpressの記事ページで動作させています。 必要なjsファイルは読み込んでおり、ファイルはそれぞれ同じ階層にあります。 何が問題で表示できないのでしょうか。どうかご教示をお願いします。

  • cakePHP+Ajax アップロード状況の取得

    環境【cakePHP2.5, PHP5.5】 ファイルアップロードの進捗状況を取得してプログレスバーを表示したいのですが、うまくいかず困っております。 現状の方式は以下です(関連部分だけ抜粋) ●cakePHPのViewファイル(アップロードForm) <?php echo $this->Form->create('Model', array('type' => 'file')); ?> //Form作成 <?php echo $this->Form->hidden(ini_get('session.upload_progress.name'), array('value' => 'example')); ?> //PHPのアップロード状況取得設定 <?php echo $this->Form->file('upload_file'); ?> //ファイル選択 <?php echo $this->Form->submit('アップロード', array('div' => false, 'escape' => false));//submit ●Viewファイル内のjavascript(submitイベントを取得してajax通信) $(function() { $('#FormName').submit( function(event) { $.ajax({ url:'/controller/action', success:function (data, textStatus) { $('#progress').html(data); }, error:function (err) { console.log('ajax通信失敗:'+err); }, }); }); }); ●cakePHPのアクション ※アップロード処理は省略 public function action() { if ($this->request->is('ajax')) { //$_SESSIONキーから進捗状況を取得 $key = ini_get("session.upload_progress.prefix").'example'; $data = $_SESSION[$key]; //パーセンテージ計算 $progressData = round(($data["bytes_processed"]/$data["content_length"])*100); //結果表示用の変数に値を入れ、更新用のViewをrender $this->set(compact('progressData')); $this->render('/Elements/ajax/progress','ajax'); } } renderしているエレメントはアップロードViewファイルの中で指定しています。 大きく問題は2つあります。 1 ajax通信が動かない  cakePHPのアクションはキックしていますが(ログを吐かせて確認)、errorが返ってきます(errの中身は[ object Object ])。  ただし、submitイベント内ではなく、たとえば<input type=button>のonClickイベント関数の中に入れてやると正常に通信できます。  また、他にも数カ所ajax通信を行っている箇所がありますが、そちらは特に問題なく通信できています  なお、ajax通信部分をsetIntervalや関数に入れてSetTimeoutの中に含めると、アクションをキックすらできず何も動かない感じになります(なぜ…)  submitとajax通信は同時には出来ないものなのでしょうか? 2 ajax通信から$_SESSIONのupload_progress関連の値が取れない  ファイルアップロード中にcakePHPのアクションに普通にアクセス(GET)すると、アップロード状況が取得できるのですが、ajaxからこのアクションにアクセスすると値が取れない($_SESSION内にこのキーと値が存在しない)状態になります。  1の問題と絡んでいるような気もしますが、なぜajax通信のときだけ取得できないのか、原因が分からず困っております。 cakePHPでファイルアップロードの進捗を表示する機能をつくられている方など、なにかヒントを頂ければと思います。 なにとぞよろしくお願いします。

  • AJAX通信のエラー処理について

    jQueryを利用したAJAX通信で、「●●.js」が不定期エラーになるのですが、エラーの意味も原因も分かりません。 Uncaught TypeError: Cannot read property 'age' of null ■質問1 $.postではエラーを捕捉出来ないと書いてあったので、$.ajaxに書き換えたいのですが、書き方がよく分かりません。どう書き直せば良いでしょうか? ■コード ▼「●●.js」 $.post('test.php',{action: "getmemberdata"},function(data){  jsondata = $.parseJSON(data);  if(jsondata == null){   return true;  }  処理 });  if(Number(jsondata.age)>10){←この箇所で不定期で上記エラーが発生! ▼「test.php」 // Echo Data For Ajax if($_POST['action']=='getmemberdata'){  処理  echo json_encode(データ); ■質問2 AJAX通信の確認をサーバ側で行うことは出来ないのでしょうか? 「test.php」で、echo json_encode(データ);する前に、  echo データ;  exit; としてみたのですが、処理が途中で止まらず、変数の中身を確認することが出来ません。 AJAX通信の確認は、$.ajaxのエラー処理でしか確認することは出来ないのでしょうか? ■質問3 (Number(jsondata.age)>10)がエラーになるので、何とか回避したいのですが、 回避する方法はあるでしょうか? if(jsondata.age==null){ とか書いてみたのですが、うまくいきませんでした

    • ベストアンサー
    • AJAX
  • jquery,ajaxによるphp通信でnull

    初めまして。 現在jqueryを勉強中の学生です。 いろいろなサイトを参考にしつつ、試しににjquery・ajaxを使ったphpとの通信を試みているのですが、文字列のやりとりがうまくいきません。 数字ではうまくいくのですが、文字になるとalertの部分でnullと返されてしまいます。 アドバイス等頂ければと思います。 よろしくお願いいたします。 以下部分的ではありますがコードを示します。 (jqueryはjquery-1.11.1.min.jsを使用) [js] $.ajax({ type: "POST", url: "step1.php", data: send_data, success: function(receive_data) { var parseAr = JSON.parse(receive_data); alert(parseAr[0]['name']); }, error: function(XMLHttpRequest, textStatus, errorThrown) {alert('Error: ' + errorThrown); } }); return false; [php側] <?php if(isset($_POST['name'])) { $result = array(); $result[] = array('name'=>'織田', 'age'=>'33'); $result[] = array('name'=>'織田', 'age'=>'33'); echo json_encode($result); } else { echo json_encode('The parameter of "name" is not found.'); } exit; ?>

専門家に質問してみよう