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

标签 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 的重复帖子结束

我将在下面包含我的代码的精简版本,以防它帮助其他人

$.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 请求之间向表中添加新记录时,我如何防止出现假设的重复项?

最佳答案

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

然后在服务器端,您可以排除在此之后创建的任何帖子,然后保留您的列表。

您还可以更进一步,将这段时间与基本的 ajax 长轮询技术一起使用,以通知用户自页面加载/上次加载新帖子以来的新帖子 - 类似于 Facebook 和 Twitter 的提要。

关于php - 防止重复无限滚动ajax加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8739489/

相关文章:

php - 返回后使用 break

php - 仅当变量更改时 Ajax 刷新 Div

javascript - 将 Html 表导出到 Excel - 所有浏览器

javascript - 为什么这个可扩展列表在 php 中没有以正确的方式显示项目?

java - 如何将 MySQL 异常传播到 Java 程序?

mysql - 历史/审计表的设计建议

php - 如何在 mysql 的 haversine 计算中查看别名的值?

php - 将街道地址解析为组件

jQuery插入多级HTML "smarter"方式?

mysql - where 子句难题 : where "LIKE" one thing but not "LIKE another" is failing?