ajax settimeout刷新div

时间:2011-10-26 13:38:03

标签: ajax browser crash settimeout

我正在使用jQplot显示图表来监控数据。 为了刷新持有图形的div,我每5秒调用一次ajax调用(参见下面的JavaScript摘录)。 在服务器上,PHP脚本从数据库中检索数据。 成功时,使用JavaScript setTimeout(ajax,5000)在5秒后重新调用ajax调用。 出错时,在显示错误消息之前,使用setTimeout(ajax,5000)重试ajax调用10次。 监控XHR了解到大约200个请求后浏览器崩溃。 作为临时补救措施,在50次迭代后发出location.reload()以防止浏览器崩溃。 这有效,但不是理想的情况。 非常感谢任何更好的解决这个问题的方法。

谢谢和问候,JZB

function ajax() {
  $.ajax({
    cache: false,
    url: 'monitor.php',
    data : { x: id },
    method: 'GET',
    dataType: 'json',
    success: onDataReceived,
    error: onDataError
  });

  function onDataReceived(series) {
    $('#chartdiv_bar').html('');
    $.jqplot('chartdiv_bar', [series['initHits']], CreateOptions(series,'Inits'));

    errorcount = 0;
    setTimeout(ajax, 5000);
  }

  function onDataError(jqXHR, textStatus, errorThrown) {
    errorcount++;
    if (errorcount == 10) {
      alert("No server response:\n\n" + textStatus + "\n" + errorThrown);
    } else {
      setTimeout(ajax, 5000);
    }
  }
}

2 个答案:

答案 0 :(得分:1)

由于您在ajax呼叫良好或失败后重新呼叫ajax(),因此您需要启动多个计时器。这就是您的浏览器崩溃的原因。

你可能想尝试清除当前的计时器,然后启动下一个计时器

var t; //global

在每个回调函数中:

if(t)      
 clearTimeout(t);
t = setTimeout(ajax, 5000);

有关计时器的更多信息:w3 school

答案 1 :(得分:0)

我按照建议删除了jqplot调用,问题就消失了。

显然jqplot是罪魁祸首,我发现很多条目都涉及jqPlot内存泄漏。
我使用jQuery 1.6.4并安装了jqPlot Charts版本1.0.0b2_r792,据说可以解决内存泄漏问题。

此外,我更换了

$('#chartdiv_bar').html('');

$('#chartdiv_bar').empty();

感谢您的支持。