AJAX setInterval bug


AJAX setInterval bug

>请在此链接中查看示例:我的测试代码

这将在我的实际站点上的div 上使用,并且有同样的问题。如您所见,div 每 2 秒闪烁一次,或者在我的测试代码站点中闪烁整个页面,然后当您向下滚动时,它将在同一时间自动向上滚动。显然,这是由设置间隔引起的。

我也收到控制台错误:

主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看 http://xhr.spec.whatwg.org/。

有什么办法可以改善这一点吗?

另外,还有其他方法可以在每秒使用 ui 呈现数据库中的更新列表吗?

这是我的代码:

<div id="container"></div>
<script>
    function refreshNews()
    {   $.get('../php/ajaxreportall.php').success(function(data){
             $("#container").html(data);
        })
    }
    refreshNews();
    setInterval(refreshNews, 2000);
</script>

脚本文件

<?php 
    require("database.php");
    $sql = "SELECT * from Report r inner join reddb.User_Info u 
            on u.user_email = r.user_email ";
    $res = odbc_exec($conn,$sql);
    echo "
            <link rel='stylesheet' type='text/css' href='../css/homelayout.css'>
            <script src='../js/home.js'></script>
        ";
    while($feedItem = odbc_fetch_array($res))
    {
        echo "
            <div class='feedItem'>
                <div>Report No. <label class='feedItemRepID'>" . $feedItem['report_id'] . "</label></div>
                <div>Name:  <label>" . $feedItem['firstname'] . "</label></div>
                <div>Contact No: <label>" . $feedItem['contact'] . "</label></div>
                <div>Details:  <label>" . $feedItem['report_detail'] . "</label></div>
                <div>Date: <label>" . $feedItem['date_report'] . "</label></div>
                <div class='buttons'>
                    <button class='btn btn-success btnRespond' data-toggle='modal' data-target='#myModal'>Respond</button>
                </div>
            </div>
            ";
    }
?>

对 Ajax 使用间隔不是一个好主意。而是改为:

function refreshNews() {   
  $.get('../php/ajaxreportall.php').success(function(data){
    $("#container").html(data);
    setTimeout(refreshNews, 2000);
  });
}
$(function() {
  refreshNews();
});  

或测试数据是否更改:

var rfn="";
function refreshNews() {   
  $.get('../php/ajaxreportall.php').success(function(data){
    if (rfn!=data) {
      $("#container").fadeOut(function() {
        $("#container").html(data);
        $("#container").fadeIn();
      });
      rfn=data;
    }
    setTimeout(refreshNews, 2000);
  });
}
$(function() {
  refreshNews();
});  

如果您希望上述操作永不停止,即使失败,请使用 .always

function refreshNews() { 
  var jqxhr = $.ajax('../php/ajaxreportall.php')
  .done(function(data){
    if (rfn!=data) {
      $("#container").fadeOut(function() {
        $("#container").html(data);
        $("#container").fadeIn();
      });
      rfn=data;
    }
  })
  .fail(function() {
    console.log( "error" );
  })
  .always(function() {
    setTimeout(refreshNews, 2000);
  });
}

该错误表明您正在尝试进行已弃用的同步调用,您的代码中可能有类似以下内容:

$.ajaxSetup({
   async: false
 });
删除此

消息或将其更改为 true,以删除此错误消息。

关于滚动和闪烁的问题:
为了刷新您的新闻内容,您正在刷新完整的 HTML,因此您的完整 HTML 会一次又一次地加载。这样想:你正在爬梯子,突然梯子消失了,一个新的梯子出现了?你会怎样?你会回到起点,即地面,挠头说刚刚发生了什么?
滚动也会发生同样的事情,用户滚动浏览新闻内容,然后突然重新加载,用户回到起点。

为了解决这个问题,你必须重构所有内容,你必须将新新闻附加到列表中,并且必须存储一些标识符来识别你的上一篇文章,你将这个标识符发送到服务器,然后你的服务器将只发送比该帖子更新的数据,并且还将向最新的帖子发送一个标识符作为响应。