6

ここで明確な解決策を見るには夜遅くかもしれませんが、意見を持っている人からいくつかの考えを得るだろうと思いました...

私が取り組んでいるサイトには、ユーザー投稿の長いリストがあります。一番下に到達または近づくと、100件の投稿の次のバッチですべてのスクロールイベントハンドラーがajaxに機能します。

私の質問は...次のシナリオを防ぐにはどうすればよいですか?

  1. UserXがサイトにアクセスし、投稿1〜100を読み込みます
  2. さらに10人のユーザーがサイトにアクセスし、さらに10件の投稿を追加します
  3. UserXは一番下までスクロールし、以前は投稿91-190であった投稿101-200を読み込みます。
  4. UserXは、ページ上の投稿91〜100の重複で終了します

他の誰かに役立つ場合に備えて、以下にコードの簡略版を含めます

$.ajax({
    type:'POST',
    url:"/userposts.php",
    data:{ limit: postCount },
    success:function(data) {
        $("postsContainer").append(data);
        if ( $("postsContainer").find("div[id='lastPostReached']") ) {
            // unbind infinite scrolling event handlers
        }
    },
    dataType:'html'
});

私のPHPスクリプトには、基本的に次のものがあります。

if ( ! isset($_POST["limit"]) ) {
    $sql .= " LIMIT 101"; // initial request
} else {
    $sql .= " LIMIT {$_POST["limit"]},101
}

$posts = mysql_query($sql);
while( $post = mysql_fetch_assoc($posts) ) {
    /* output formatted posts */
}

// inform callback handler to disable infinite scrolling
if ( mysql_num_rows($posts) < 101 ) {
    echo '<div id="lastPostReached"></div>';
}

これにより、無限のスクロールが素晴らしく簡単になりますが、ajaxリクエストの間に新しいレコードがテーブルに追加されたときに表示される仮想の重複を防ぐにはどうすればよいですか?

4

3 に答える 3

9

ページが読み込まれたときのサーバー時間を示すタイムスタンプをphpから定義し(たとえばvar _loadTime = <?php echo time(); ?>)、この値を制限とともにAjaxデータ構成オブジェクトの一部として渡します。

次に、サーバー側で、この時間以降に作成された投稿を除外し、リストを保持することができます。

さらに一歩進んで、この時間を基本的なajaxロングポーリング手法と一緒に使用して、FacebookやTwitterのフィードと同様に、ページが読み込まれた/新しい投稿が最後に読み込まれてから、新しい投稿をユーザーに通知することもできます。

于 2012-01-05T08:33:31.173 に答える
2

ajaxリクエストを更新して、limitパラメーターに加えて、現在の範囲の投稿IDを渡すようにします(投稿にはある種の一意のIDがあると想定しています)。次の一連の投稿を取得するときにこれらのパラメーターを考慮に入れるようにPHPを更新します。

つまり、「give me another 100」と言う代わりに、リクエストは「give me 100 startatidx」です。

(申し訳ありませんが、このためのサンプルコードを作成する時間がありません。)

于 2012-01-05T08:30:00.883 に答える
0

投稿には一意の識別子IDを使用し、逆方向に数えます。

最初の訪問ユーザーは投稿603-503を要求します

10人のユーザーがページにアクセスしてコメントを追加するため、最高のコメントは613になります。

ユーザーがスコールダウンして503-403をリクエスト

問題が解決しました?:)

于 2012-01-05T08:23:45.967 に答える