2012-01-05 53 views
6

它可能只是太深夜,我在这里看到一个明确的解决方案,但我想我会得到任何人的一些想法与意见了......防止重复无限滚动的ajax装载机

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

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

  1. 用户X访问该网站,并加载职位1-100
  2. 了10个用户访问该网站,并添加10个职位
  3. 用户X滚动到下和负载岗位101-200,这曾经是张贴91-190
  4. 用户X与页面上的帖子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请求之间的表中?

回答

8

您定义从PHP时间戳,指示当时的servertime的页面负载(例如var _loadTime = <?php echo time(); ?>),然后通过此值作为Ajax数据配置对象的一部分以及限制。

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

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

+0

辉煌,谢谢!这一切似乎现在这么简单... – overeasy 2012-01-05 08:40:27

+0

如果有人删除了一些内容会怎么样? – 2013-02-07 12:35:53

0

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

第一次访问用户请求的帖子603-503

十大得到用户的页面上并添加注释,以便最高的评论是现在613

用户scolls下来,并要求503-403

问题解决了? :)

+0

如果我总是按照反向时间顺序排序,那很好,但我使用了几个过滤器来对帖子列表进行排序,因此帖子的主键将以随机顺序排列......我认为包括在我的帖子中数据是所有当前列出的帖子的数组,以排除未来的SQL查询(即'NOT IN(a,b,...,z)'),但是这个数组最终可能有100个ID,似乎并不实际 – overeasy 2012-01-05 08:34:11

+0

从原始过滤器向后排序(ASC = DESC,DESC = ASC),然后将数据集末尾的块切割到前面。例如你的第一个块后限制是(postnumbers-100到postnumbers),之后它总是你上次交付的索引--100到最后一个索引。这样逻辑上所有新数据都会附加到数据集的末尾。 – bardiir 2012-01-05 08:39:26

2

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

也就是说,不是说“给我另外100个”,而是要求“给我100个以id开头的x”。

(对不起,我没有现在的时间来写一个这样的例子代码。)

+0

这在我看来似乎是更强大的方法(抵制添加和删除)。我想知道一些查询的实现。 @nnnnnn你能提供一个例子吗? – 2013-02-07 12:37:28