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 回答