Ajax重新发送XMLHttpRequest

时间:2012-06-03 23:31:59

标签: javascript ajax xmlhttprequest

我有一个像这样的客户端js / ajax脚本:

<p>server  time  is:  <strong  id="stime">Please  wait...</strong></p>

<script>
function  updateAjax()  {
    xmlhttp  =  new  XMLHttpRequest();
    xmlhttp.onreadystatechange  =  function()  {
        if (xmlhttp.readyState==3  &&  xmlhttp.status==200)  {
            document.getElementById("stime").innerHTML=
            xmlhttp.responseText;
        }
        if  (xmlhttp.readyState==4)  {  
            xmlhttp.open("GET","date-sleep.php",true);
            xmlhttp.send();
        }
    }
    xmlhttp.open("GET","date-sleep.php",true);  
    xmlhttp.send();
}
window.setTimeout("updateAjax();",100);
</script>

服务器端的一个:

<?php
    echo  6;
    for  ($i=0;  $i<10;  $i++)  {
        echo  $i;
        ob_flush();  flush();
        sleep(1);
    }
?>

在第一次'打开'和'发送'之后它运行正常,但是当服务器完成脚本并xmlhttp.readyState == 4时,xmlhttp重新发送请求但没有任何反应。

1 个答案:

答案 0 :(得分:1)

不要一直重复使用相同的XHR对象,而是尝试使用新对象重复该函数。这应至少解决您列出的不兼容问题。

如果要无限循环,请尝试在回调中重新调用Ajax函数。

if  (xmlhttp.readyState==4) {  
     updateAjax(); //or setTimeout("updateAjax();",100); if you want a delay
}

我还建议将.innerHTML方法放在.readyState==4内,即所请求的文档已完全加载,.status==200表示成功。像这样:

if (xmlhttp.readyState==4  &&  xmlhttp.status==200) {
       document.getElementById("stime").innerHTML=
       xmlhttp.responseText;
       updateAjax(); //or setTimeout("updateAjax();",100);
}

此外,如果您希望Ajax是跨浏览器,则应测试浏览器是否支持您正在使用的XHR object

var xmlhttp = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

我只是输入上面的代码,但它应该可以正常工作以增加与旧版IE和其他浏览器的兼容性。