【问题标题】:Ajax resending XMLHttpRequestAjax 重新发送 XMLHttpRequest
【发布时间】:2012-06-03 23:31:58
【问题描述】:

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

【问题讨论】:

    标签: javascript ajax xmlhttprequest


    【解决方案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 和其他浏览器的兼容性。

    【讨论】:

    • 我发现它可以在 Iceweasel 中使用。我想由于某些 Firefox 缓存,它无法正常工作。在“if”块中修改innerHTML会改变脚本的行为,它应该总是在服务器发送下一个数据后更新页面,而不仅仅是在连接关闭时。
    • 我上面的解决方案是跨浏览器,只是你没有正确测试浏览器的XHR对象。我也会将其添加到答案中。
    • Ctrl+F5 你的火狐,试试我的脚本。它应该完全符合您的要求并兼容跨浏览器,如果没有,请尝试在 jsfiddle 或其他现场风景中重现您的问题。
    • 感谢您的回答。这只是我的课程中的一些示例代码,因此跨浏览器兼容性并不那么重要。
    • 好的,我明白了。然后考虑跨浏览器代码部分,我上面的代码至少应该像您的问题所暗示的那样无限循环。如果您需要.readyState==3,请在答案中仅使用我的第一段代码。告诉我您之后的代码是否有任何问题。 =]
    猜你喜欢
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2011-10-26
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多