2017-08-16 13 views
2

私は、MySQLデータベースからデータを取得し、EventSource APIを使用してウェブサイトに表示しています。これまでのところすべてが正常に機能していましたが、データを固定の高さのdivに表示し、スクロールバーをdivに固定します。つまり、常に最新のフィード結果が最初に表示されます。ライブデータフィードとスクロールバーの位置

ページを読み込むと、スクロールバーは上部に固定されます。

私は提案hereを試しましたが、それは動作しないようです。それはdivを入力するためにライブデータとAJAXリクエストを処理しているからですか?

私の結婚式はこれまで通りです。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.js"></script> 
    <style type="text/css"> 
     #result { 
      overflow: auto; 
      max-height:224px; 
      width: 500px; 
     } 
    </style> 
    <script type="text/javascript"> 
       // scrollbar to bottom 
       $("document").ready(function(){ 
        var objDiv = document.getElementById("result"); 
        objDiv.scrollTop = objDiv.scrollHeight; 
       }); 
       // retrieve data from server and display in div 
       $("document").ready(function(){ 
        var source = new EventSource("data.php"); 
        var offline; 
        $.ajax({ 
         type: "POST", 
         url: 'data.php', 
         data: {lastSerial: true}, 
         dataType: 'json', 
         success: function(data){ 
          $.each(data, function(key, value) { 
           document.getElementById("result").innerHTML += "New transaction: " + value.SerialNo + ' ' + value.TimeStamp + "<br>"; 
          }); 
         } // end success 
        }); 
      });//end dom ready 
    </script> 
</head> 
<body> 
    <div id="result"><!--Server response inserted here--></div> 
</body> 
</html> 

奇妙な、私はそれが機能<div id="result">にいくつかの(Loremのイプサム)テキストを追加するJavaScript、手動でライブフィードを削除するたびに、これは、スクロールバーがdivの下部に表示されています。

私が何かアドバイスが高く評価され、非常に愚かな何か:)

を行うことができます。

答えて

3

ajax経由でさらにデータを読み込むと、コンテンツのサイズが変更されます。あなたはコンテンツをレンダリングした後にもう一度スクロールを設定しようとしましたか?つまり、

このように、ページの読み込み時と同じ方法でスクロール値を設定します。


はまた、ここでは別の完全に異なるオプションがあります:

あなたは、最新の値が最も顕著になりたい場合は、あなたがの上部に単に逆の順序で出力して、その最新のものですができdiv、最初にユーザーに表示されます。 jQueryの.prepend()メソッドを使用して、前の結果の上にあるdivの先頭にコンテンツを追加することができます。それでは、スクロールをするのをやめる必要はありません。 http://api.jquery.com/prepend/私はこれがよりユーザーフレンドリーであると主張したいと思いますが、明らかにあなた次第です。

+1

両方のソリューションが完璧に動作します。私はあなたの2番目の '.prepend()'メソッドを使うことに決めました。ありがとう – TheOrdinaryGeek

1

それはあなたが欠落していただけの小さな行だった、コード

$.ajax({ 
    type: "POST", 
    url: 'data.php', 
    data: {lastSerial: true}, 
    dataType: 'json', 
    success: function(data){ 
     var objDiv = document.getElementById("result"); 

     $.each(data, function(key, value) { 
      objDiv.innerHTML += "New transaction: " + value.SerialNo + ' ' + value.TimeStamp + "<br>"; 
     }); 
     objDiv.scrollTop = objDiv.scrollHeight; 
    } // end success 
}); 
2

の下に追加してください私はこの約100%確実ではないが、私が見る1つの問題は、あなたが非同期AJAX呼び出しを作っているということですサーバーの後に、divの下にスクロールします。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.js"></script> 
    <style type="text/css"> 
     #result { 
      overflow: auto; 
      max-height:224px; 
      width: 500px; 
     } 
    </style> 
    <script type="text/javascript"> 
       // retrieve data from server and display in div 
       $("document").ready(function(){ 
        var source = new EventSource("data.php"); 
        var offline; 
        $.ajax({ 
         type: "POST", 
         url: 'data.php', 
         data: {lastSerial: true}, 
         dataType: 'json', 
         success: function(data){ 
          $.each(data, function(key, value) { 
           document.getElementById("result").innerHTML += "New transaction: " + value.SerialNo + ' ' + value.TimeStamp + "<br>"; 
          }); 
         var objDiv = document.getElementById("result"); 
         objDiv.scrollTop = objDiv.scrollHeight; 
         } // end success 
        }); 
      });//end dom ready 
    </script> 
</head> 
<body> 
    <div id="result"><!--Server response inserted here--></div> 
</body> 
</html> 

説明:あなたはそれの一番下までスクロールした後、div要素が取り込まれます

たぶんこれの線に沿って何かをしてみてください。したがって、スクロールが実行されると、scrollHeightプロパティはdivの元の高さの値になります。ここで、divを入力した後にスクロールアクションを実行すると、正常に動作するはずです。そのコードは「アンカー」下にスクロールバーを言っていない

2
var objDiv = document.getElementById("result"); 
objDiv.scrollTop = objDiv.scrollHeight; 

が、それは一度だけのdivの実際の高さを下にスクロールすると言うが、あなたは前に、あなたのAJAX要求を、このコードを置くので、あなたのdiv空でなければならないので、ajaxの "success"関数の最後に2行を入れてください。

success: function(data){ 
    $.each(data, function(key, value) { 
     document.getElementById("result").innerHTML += "New transaction: " + value.SerialNo + ' ' + value.TimeStamp + "<br>"; 
    }); 
    var objDiv = document.getElementById("result"); 
    objDiv.scrollTop = objDiv.scrollHeight; 
} 
関連する問題