3

我有一个这样的客户端 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 重新发送请求但没有任何反应。

4

1 回答 1

2

不要一直重复使用同一个 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 对象:

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

我刚刚输入了上面的代码,但它应该可以很好地添加与旧版本 IE 和其他浏览器的兼容性。

于 2012-06-03T23:37:51.627 回答