2017-08-12 4 views
1

私はajaxでプログレスバーを作るのに大きな問題がありました。全体のページがajaxにあり、Webページの1つの内部に、データベースから大きな行を取得する関数をロードするajaxがあります。私はこのスクリプトでforeachループのflush()メソッドのプログレスバーを作成しようとしましたが、$ _SESSIONに書き込み/読み込みを行いましたが、まだ何もありません。私のプロジェクトを完了するためだけにこれが必要です。誰かが私にこれを手伝ってもらえますか?とにかくスクリプトをロードしたいのですが、このプログレスバーのテンプレートは、AJAXのGETやPOSTのAJAXでどのように使用するのですか?ロードスクリプトのAJAXプログレスバー

<script> 
    jQuery(document).ready(function($) { 

      $(document).on('click','#save',function() { 
       setTimeout(getProgress,1000); 
       $(this).text('Pobieram analizę...'); 
       $.urlParam = function(name){ 
      var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); 
    if (results==null){ 
     return null; 
    } 
    else{ 
     return decodeURI(results[1]) || 0; 
    } 
      } 
     var id = $.urlParam('id'); 
     var idt = $.urlParam('idt'); 
        $.ajax({ 
           url: "views/getresults.php?id="+id+"&idt="+idt, 
        success: function(data) { 
         $("#loadresults").append(data); 
        } 
       }); 
       setTimeout(getProgress,3000); 
      return false; 
      }); 
      function getProgress(){ 

       $.ajax({ 
        url: 'views/listen.php', 
        success: function(data) { 
         if(data<=100 && data>=0){ 
          console.log(data); 
          $('#loadresults').html('<div id="progress"><div class="progress-bar" role="progressbar" style="width:'+ (data/100)*100 +'%">'+ data + '/' +100+'</div></div>'); 
          setTimeout(getProgress,1000); 
          console.log('Repeat'); 
         } else { 
          $('#loadresults').text('Pobieram dane'); 
          console.log('End'); 
         } 
        } 
       }); 
      } 
     }); 
     </script> 

、ここでGETRESULTS.PHP

foreach($result as $resul) { 
    $count++; 
    session_start(); 
    $_SESSION['progress'] = $count; 
    $_SESSION['total'] = 100; 
    session_write_close(); 
    sleep(1); 
} 
unset($_SESSION['progress']); 

AND GET PROGRESS機能LISTEN.PHP

<?php 
session_start(); 
echo (!empty($_SESSION['progress']) ? $_SESSION['progress'] : ''); 

if (!empty($_SESSION['progress']) && $_SESSION['progress'] >= $_SESSION['total']) { 
    unset($_SESSION['progress']); 
} 

?> 
+0

あなたがしようとした何? –

+0

ほとんどの場合、このセッションメソッドは、html5のスピナーを使用しています。 – CommanderSpock

+0

私はajaxで新しく、多くの作業を行いましたが、このプログレスバーは... – CommanderSpock

答えて

1

ライティングやPHPの標準的な動作は、あなたのメインのコードが実行されている間にセッションファイルをロックすることですので、セッションの読み取りが動作しないなどのサーバーサイドのイベントやロングポーリングを見てみましょう。

ファイルを作成して、その内容を、関数の実行中に実行されたパーセンテージで更新してみてください。ような何か:

<?php 
function slowFunction() { 
    $file = uniqid(); 
    file_put_contents($file, 0); 
    // Long while that makes your stuff 
    // you have to know how many loops you will make to calculate the progress 
    $total = 100; 
    $done = 0; 
    while($done < $total) { 
     $done++; 
     // You may want not to write to the file every time to minimize changes of being writing the file 
     // at the same time your ajax page is fetching it, i'll let it to you... 
     $progress = $done/$total; 
     file_put_contents($file, $progress); 
    } 
    unlink($file); // Remove your progress file 
} 

>

+0

セッションと同じですが、ファイルを使用していますか? – CommanderSpock

+0

私のコードにこのコードを実装して、より理解しやすいでしょうか? – CommanderSpock

+0

申し訳ありませんが、あなたの質問を見たときにコードはありませんでした。はい、セッションと同じですが、ファイルを使用しています。あなたの関数 "getProgress"はそのファイルをlistenしなければならないので、 "listen.php"の代わりにその名前を渡す必要があります。 –

0

あなたは、Ajaxからのデータのダウンロードの進捗状況を取得することはできません。サーバーに要求すると、次の応答はデータを取得した後、またはエラーが発生したときだけになります。

解決策は、分数としてデータを取得することです。最初にデータの1/10をダウンロードし、成功コールバックで再帰的にajaxを呼び出して、2/10番目のデータを要求します。成功コールバックごとに、プログレスバーを変更することができます。

+0

私のコードを貼り付けた – CommanderSpock

0

はオプション

関連する問題