2014-12-02 83 views
2

有一个小的网页从Web服务器请求XML文件。 Web服务器每秒更新一次该文件,并在网页上显示新数据。重复的AJAX请求缓慢的浏览器

页面运行一段时间后,每当它从服务器获取新数据(每秒两次)时,它会减慢整个浏览器的速度。问题是间歇性的 - 有时会持续几秒钟,有时会持续更长时间。

这个问题存在于Firefox中。

function getData() { 
    var dataVal = parseFloat($("#data").html().substring(0, 100)); 
    doSomethingWithVal(XTEval); // seemingly irrelevant, as it lags without this function too 
} 

t = 0.5; 

function process_xml() { 
    var xmlhttp = GetXmlHttpObject(); 

    if (xmlhttp === null) { 
    alert("Your browser does not support AJAX!"); 
    return; 
    } 

    xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState === 4) { 
     document.getElementById("data").innerHTML = xmlhttp.responseText; 
     getData(); 
     setTimeout('process_xml()', t * 1000); // moved from end of function to here based on a suggestion 
    } 
    }; 
    xmlhttp.open("GET", "data.shtml", true); 
    xmlhttp.send(""); 
} 

function GetXmlHttpObject() { 
    if (window.XMLHttpRequest) 
    return new XMLHttpRequest(); 
    if (window.ActiveXObject) 
    return new ActiveXObject("Microsoft.XMLHTTP"); 
    return null; 
} 

data.shtml只包含:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<!--#echo var="someVal.val" --> 

或许有比使用AJAX不同/更好的办法?

+2

在这个函数中用'var'声明你的“xmlhttp”变量是个好主意。没有这个,它是一个全局变量,并且连续调用“process_xml”并覆盖其先前的值。 – Pointy 2014-12-02 17:33:24

+0

谢谢!我不知道这一点,而且我已经做出了改变。我继承了这些代码,并且一直在慢慢更新它。 – 2014-12-02 17:40:22

+1

我说得对,getData不在你的代码中,getXTE不是从process_xml调用的吗?你可以证实这一点或修复你的例子(其中可能包括修复XTEVal和dataVal) – rene 2014-12-02 20:43:04

回答

1

我不知道这是问题所在,但是如果往返于服务器,再加上解析以及您在process_xml中所做的所有操作需要超过500毫秒,那么您将得到几个请求这会最终堵塞管道(浏览器可以同时处理多少个管道)。在完成所有工作后,最好在onreadystatechanged处理程序中调用setTimeout

+0

我做了改变,但没有雪茄。运行一分钟左右后,它仍然变慢。 – 2014-12-03 13:49:34

+0

仅在FireFox或所有浏览器中存在问题吗? – Paul 2014-12-03 16:12:32

+0

它看起来像Chrome不受影响。虽然很难确定,但因为问题是零星的。 – 2014-12-03 16:58:51