防止重复无限滚动ajax加载器

时间:2012-01-05 08:17:19

标签: php jquery mysql ajax infinite-scroll

在这里看到一个明确的解决方案可能只是为时已晚,但我想我会从任何有意见的人那里得到一些想法......

我正在处理的网站有很长的用户帖子列表。当你到达或接近底部时,我已经让所有滚动事件处理程序在下一批100个帖子中为ajax工作。

我的问题是......如何阻止以下情况?

  1. UserX访问该网站并加载帖子1-100
  2. 另有10位用户访问该网站并添加10个帖子
  3. UserX滚动到底部并加载帖子101-200,以前是帖子91-190
  4. UserX最终会在页面上发布帖子91-100的重复内容
  5. 我将在下面包含我的代码的精简版本,以防它可以帮助其他任何人

    $.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请求之间将新记录添加到表中时出现的假设重复项?

3 个答案:

答案 0 :(得分:9)

您可以从php定义一个时间戳,指示页面加载时的servertime(例如var _loadTime = <?php echo time(); ?>),然后将此值作为Ajax数据配置对象的一部分与限制一起传递。

然后在服务器端,您可以排除在此时间之后创建的所有帖子,并保留您的列表。

您还可以更进一步,利用这段时间以及基本的ajax长轮询技术,在页面加载/上次加载新帖子时通知用户新帖子 - 类似于Facebook和Twitters Feed。

答案 1 :(得分:2)

更新您的ajax请求,以便除了limit参数之外,您还可以通过当前的post ID范围(我假设这些帖子具有某种唯一ID)。更新你的php,以便在检索下一组帖子时考虑这些参数。

也就是说,不是说“给我另外100个”,而是“从id x开始给我100个。”

(抱歉,我现在没时间为此编写示例代码。)

答案 2 :(得分:0)

只需为帖子使用唯一标识符ID并向后计数。

首次访问用户请求帖子603-503

十个用户进入页面并添加评论,因此最高评论现在为613

用户责骂并请求503-403

问题解决了吗? :)