在这里看到一个明确的解决方案可能只是为时已晚,但我想我会从任何有意见的人那里得到一些想法......
我正在处理的网站有很长的用户帖子列表。当你到达或接近底部时,我已经让所有滚动事件处理程序在下一批100个帖子中为ajax工作。
我的问题是......如何阻止以下情况?
我将在下面包含我的代码的精简版本,以防它可以帮助其他任何人
$.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请求之间将新记录添加到表中时出现的假设重复项?
答案 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
问题解决了吗? :)