不正确的AJAX数据加载" infinity "滚动

Incorrect AJAX data loading with "infinite" scrolling

本文关键字:quot infinity 滚动 加载 AJAX 数据 不正确      更新时间:2023-09-26

我目前正在编写一个脚本,当您触发它(通过单击链接)或滚动到页面底部时加载内容。我这样做是为了好玩,但它慢慢变成了一场噩梦……触发部分正常工作,而"滚动到底部"部分有时工作,有时不工作。它有时会加载一个帖子两次,有时重复的帖子集(我一次加载5),而不是显示下一个集,我的猜测是,这是因为它加载内容如此之快,那:

  1. 查询得到所有混合(AJAX调用/mysql查询/响应…?)或…
  2. DOM有某种问题(我猜这是调用这个的正确方式…)或…
  3. 这是另一个故障的原因,我目前无法想到,因为我的基本知识…

当你保持滚动条向下时,问题就出现了,所以它加载内容的速度非常快,这在Firefox中尤其严重,因为如果你已经在底部刷新页面,它会无限加载,直到没有更多的帖子,而且它的加载速度非常快。

我一整天都在尝试不同的方法…我找不到解决办法首先,我尝试设置一个标志,这样当每个AJAX调用结束时,它就会按加载的帖子数量增加某个变量,并且只有在帖子数量增加时才会再次执行调用,而且它必须有序地执行(在我的脑海中,这意味着AJAX调用成功)。

然后我尝试设置一个超时,对于AJAX调用,然后对于包含该调用的函数,然后对于首先执行该函数的函数(滚动到底部),这种工作,但缺点是它没有为该超时做任何事情(因此,甚至没有显示"加载"html),并且情况发生的次数更少,但仍然发生。我还尝试在$.ajax()函数中设置超时,我认为这是一种不同的超时,因为它没有做我想要的……

最后,我试着让async为假,这是一件坏事,因为它挂起页面,直到它完成,因为它也被弃用;不用说,它也没有工作(我没有注意到任何明显的行为变化)。

我真的迷路了;我甚至不确定为什么会发生这种"故障"……

    $.ajax({    //Removed some code in order to make it brief                             
  url: 'load.php',        
  type: 'post',     
  dataType: 'json',       
  data: {offset: countContent, limit: displayNumber},
  success: function(data)         
  {
           if(data)
           {
            for(var i=0;i<display_n;i++)
                     {
            var title = data[i][1];
            var author = data[i][2];
            var img = data[i][3];
            var date = data[i][4];
            var htmlStr = 
            '<div class="post" id="'+i+'"></div>';
           $(element).append(htmlStr);
           $(element).children('#'+i+':last').hide().fadeIn(200+(i*250));
                      }
            }
           else if(data == null){
             //Do something when there are no more posts
          }
  },
  error: function() { 
         // Error     
                     }
});

和处理ajax调用的php

<?php
$offset = (int) $_POST['offset'];
$limit = (int) $_POST['limit'];
$db = 'mysql:host=localhost;dbname=posts;charset=utf8';
$u = 'username';
$p = 'password';
$con = new PDO($db,$u,$p);
$q = $con->prepare("SELECT id, title, author, img, date FROM articles 
ORDER BY id DESC LIMIT :limit OFFSET :offset");
$q->bindParam(':offset',$offset,PDO::PARAM_INT);
$q->bindParam(':limit',$limit,PDO::PARAM_INT);
$q->execute();
$articles = $q->fetchAll(PDO::FETCH_NUM);
$con = null;
$array_count = count($articles);
if ($articles){
 for ($i=0;$i<$array_count;$i++)
   {
$articles[$i][4] = date("d F Y",strtotime($articles[$i]['4'])); 
  }
   echo json_encode($articles);
  }
 else
 {
  $articles = null; //sends null if the data is empty
 echo json_encode($articles);
 }
?>

是否有任何方法来"延迟"ajax调用之前另一个得到执行,使文章正确加载?还是等到ajax中的一切都按照计划加载,然后再去下一个?在这种情况下我能做什么?

我很抱歉,如果这篇文章有点大,我想我想说明一点,哈。非常感谢你的帮助,谢谢。

编辑:这是我在下面发布的内容,以及解决方案:

我将运行的全局变量设置为false,并包装了整个AJAX调用if !运行条件,立即使该变量在进入循环后为True,并在参数"complete: "ajax函数或通过$. ajaxcomplete ()。我猜也可以使用.on()和。off()语句来绑定和取消绑定事件触发器,但我发现前面的方法要简单得多。

这允许AJAX调用在另一个调用开始之前完成,并正确显示内容。

我建议您在触发事件触发器后立即关闭它,并在填充dom后重新打开它。