【问题标题】:Auto refresh with ajax is hanging / crashing browser after 10-15 seconds使用 ajax 的自动刷新在 10-15 秒后挂起/崩溃浏览器
【发布时间】:2016-10-21 19:15:45
【问题描述】:

使用 ajax 自动刷新 div 会在 10-15 秒内挂起浏览器。我不知道是什么问题。当我检查笔记本电脑时,它会挂起/崩溃,并且在移动设备中也是如此。

在笔记本电脑上显示浏览器无响应。

代码如下:

function ajaxCall() {
    $.ajax({
        url: "cart_checkout.php", 
        success: (function (result) {
            $("#resultDiv").html(result);
        })
    })
};
ajaxCall();
setInterval(ajaxCall, (1 * 1000));

【问题讨论】:

  • 你的代码每1秒刷新一次div内容setInterval(ajaxCall, (10 * 1000));
  • 您的成功调用是否已触发,您是否检查过您的 ajax 状态,是否已完成,是否有任何错误控制台显示?
  • 从 chrome 点击 F12 和 tab Console 然后刷新页面
  • @RajdeepPaul / Rajdeep Paul

标签: javascript jquery


【解决方案1】:

您的代码有 2 个可能导致该问题的潜在问题。

您不应在此处使用setInterval,因为无论最后一个请求是否完成,它都会触发 AJAX 调用。它没有考虑每个请求的持续时间和加载时间。

轮询 API 并将结果加载到元素中的完整工作示例:

function poll(element, url, frequency) {
  let timeoutID
  let count = 0
  function _poll() {
    count++
    $.ajax({
      url,
      success: ((result) => {
        element.innerHTML = `Response ${count} at ${new Date().toLocaleString()}\n${JSON.stringify(result, null, 2)}`
        if(frequency)
          timeoutID = setTimeout(_poll, frequency)
      })
    })
  }
  _poll()
  return () => {
    console.info('cancelling polling')
    clearTimeout(timeoutID)
  }
}

$(() => {
  // Start polling every 2 seconds (from time last response was received
  let cancelPolling = poll(document.getElementById('result'), 'https://api.nytimes.com/svc/search/v2/articlesearch.json', 2000)

  // Cancel polling in 15 seconds
  setTimeout(cancelPolling, 15000)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<pre id="result" />

第二个问题是,将 HTML 直接放入结果 div 是一个同步操作,会占用 JavaScript 线程,导致其无响应。如果有效负载很小(分页),这可能很好,但对于大型有效负载,您会看到浏览器挂起。另一种选择是返回 JSON 而不是原始 HTML,将其拆分为可管理的块(每个块约 5 行数据),然后使用 requestAnimationFrame 回调将结果写入 HTML。

【讨论】:

  • 我尝试了您的代码,但现在我收到会话已启动的错误,如果我使用我的代码,它不会给出此错误
  • 我发布的代码中的任何内容都不应引发该错误。您需要发布完整的错误消息和堆栈跟踪,以便我能够提供帮助。
  • 会话已经开始 - 忽略第 43 行 c:\xampp\htdocs\site\cart_checkout.php 中的会话 start() ....
  • 这对我来说听起来像是一个 PHP 问题。我发布了您所询问的客户端代码的工作示例。如果您需要在开始之前等待网站 DOM 完成加载,您可能需要将启动您的应用程序的代码和此代码包装在 $(() =&gt; poll($element, '&lt;url&gt;', 1000)) 中。
  • 同一期的会话。主文件是 cart.php 在这个文件中的 session 也被调用,并且在 cart_checkout.php 中也是因为这个 cart_checkout.php 也必须有 ssession
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多