1

以下は、ページの読み込み時に呼び出すコードです。
使用すると機能します

xmlhttp.open("GET", "../handlers/fetchshift.ashx?id=" + divs[i].id, false); 

しかし、私が使用する場合

xmlhttp.open("GET", "../handlers/fetchshift.ashx?id=" + divs[i].id, true);

xmlhttp.onreadystatechange は、最後の div に対してのみ呼び出されます。なぜそれが起こっているのですか?非同期モードで必要です。

function myfunction() {
     try {

         if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
             xmlhttp = new XMLHttpRequest();

         }
         else {// code for IE6, IE5
             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
         }

         var table = document.getElementById('<%=GridView1.ClientID%>');
         if (table == null) return;
         var divs = table.getElementsByTagName('div');
         for (var i = 0; i < divs.length; i++) {

             xmlhttp.onreadystatechange = function () {
                 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

                     var msg = xmlhttp.responseText.split("|");
                     var table = document.getElementById('<%=GridView1.ClientID%>');
                     var divs = table.getElementsByTagName('div');
                     for (var i = 0; i < divs.length; i++) {
                         if (divs[i].id == msg[0]) {
                             divs[i].innerHTML = msg[1];
                             divs[i].parentNode.style.backgroundColor = msg[2];
                         }

                     }
                 }
             }



             xmlhttp.open("GET", "../handlers/fetchshift.ashx?id=" + divs[i].id, false);

             xmlhttp.send();
         }


     } catch (e) {
         alert(e);
     }
 }
4

1 に答える 1

1

xmlhttpサイクル内に新しいオブジェクトを作成する必要がありますfor。現在、毎回すべてを上書きしているため、実際には最後のリクエストのみが通過します。

すべてが完了するまでブロックされるため、同期モードで動作するためxmlhttp.open()、次の反復ですべてが上書きされますが、それはもう問題ではありません。

function myfunction() {
     try {
         var table = document.getElementById('<%=GridView1.ClientID%>');
         if (table == null) return;
         var divs = table.getElementsByTagName('div');
         for (var i = 0; i < divs.length; i++) {

         if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
                 xmlhttp = new XMLHttpRequest();
             }
             else {// code for IE6, IE5
                 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
             }

             xmlhttp.onreadystatechange = function () {
                 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

                     var msg = xmlhttp.responseText.split("|");
                     var table = document.getElementById('<%=GridView1.ClientID%>');
                     var divs = table.getElementsByTagName('div');
                     for (var i = 0; i < divs.length; i++) {
                         if (divs[i].id == msg[0]) {
                             divs[i].innerHTML = msg[1];
                             divs[i].parentNode.style.backgroundColor = msg[2];
                         }

                     }
                 }
             }

             xmlhttp.open("GET", "../handlers/fetchshift.ashx?id=" + divs[i].id, false);
             xmlhttp.send();
         }
     } catch (e) {
         alert(e);
     }
}
于 2013-03-20T09:40:51.933 に答える