2012-06-03 3 views
2
повторной

У меня есть на стороне клиента JS/AJAX скрипт так: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. Модификация innerHTML в этом блоке «if» изменит поведение скрипта, который должен обновлять страницу всегда после того, как сервер отправит следующие данные, а не только когда соединение станет закрытым. – jllj

+0

Мое решение выше - кросс-браузер, за исключением того, что вы не тестировали объект XHR браузера должным образом. Я добавлю это и к ответу. –

+0

Ctrl + F5 ваш firefox и попробуйте мой скрипт. Он должен делать именно то, что вам нужно, и быть совместимым с кросс-браузером, если нет, попытайтесь воспроизвести свою проблему в [jsfiddle] (http://jsfiddle.net) или другом живом пейзаже. –

Смежные вопросы