2012-06-03 65 views
2

我有一个客户端JS/AJAX脚本是这样的:阿贾克斯重新发送的XMLHttpRequest

<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

不是一直重复使用同一个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和其他浏览器的兼容性。

+0

我想通了,它在Iceweasel中有效。我想这是因为一些Firefox缓存不能正常工作。在'if'块中修改innerHTML将会改变脚本的行为,它应该在服务器发送下一个数据后不断更新页面,不仅在连接关闭时。 – jllj

+0

我上面的解决方案是跨浏览器,只是您没有正确测试浏览器的XHR对象。我也会将其添加到答案中。 –

+0

Ctrl + F5你的Firefox,并尝试给我的脚本。它应该完全按照你想要的做法,并且如果不是,可以跨浏览器兼容,试着在[jsfiddle](http://jsfiddle.net)或其他现场风景中重现你的问题。 –