3

次のようなクライアント側の 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);
    }
?>

最初の 'open' と 'send' の後は問題なく動作しますが、サーバーがスクリプトを終了しxmlhttp.readyState == 4、xmlhttp がリクエストを再送信すると、何も起こりません。

4

1 に答える 1

2

同じ 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 や他のブラウザーとの互換性を追加するために問題なく動作するはずです。

于 2012-06-03T23:37:51.627 に答える