Аякс отправьте запрос


У меня есть клиентский скрипт 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>

И a на стороне сервера:

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

После первого "open" и "send" он работает нормально, но когда сервер заканчивает сценарий и xmlhttp.readyState == 4 затем xmlhttp повторно отправляет запрос, но ничего не происходит.

1 2

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 , который вы используете:

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

Я только что набрал код выше, но он должен работать просто отлично, чтобы добавить совместимость с более старыми версиями IE и других браузеров.