我有一个像这样的客户端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重新发送请求但没有任何反应。
答案 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和其他浏览器的兼容性。