簡體   English   中英

循環在onreadystatechange內部不起作用

[英]loop doesn't work inside `onreadystatechange`

這是我的代碼:

xmlhttp.onreadystatechange = function () {

              if (this.readyState == 4)

                  if( this.status == 200) {
                  response = xmlhttp.responseXML;
                  var channel = response.documentElement;
                  var title = channel.getElementsByTagName("title")[0].firstChild.nodeValue;

                  var parent =  document.getElementById("journalTitle");
                  parent.innerHTML = title;

                  var articleList = document.getElementById("articleList");

                  item = channel.getElementsByTagName("item");
                  var list = new Array();
                  itemSize = (channel.getElementsByTagName("item").length);
                  var i =0;
                  do{

                      list[i] = item[i].getElementsByTagName("title")[0].firstChild.nodeValue;

                      item = document.createElement("div");
                      item.innerHTML = list[i];
                      articleList.appendChild(item);
                      i++;


                  }while(i=itemSize);

                } 

size變量是22,當我編寫alert(item[5].getElementsByTagName("title")[0].firstChild.nodeValue); 它向我顯示了第五個元素,依此類推,但是在循環中,它僅了解item的第一個元素,其余的它返回error:

Uncaught TypeError: Cannot call method 'getElementsByTagName' of undefined

您在while循環中的情況沒有進行任何比較。 這是一個定義,將i的值設置為itemSize (根據OP為22)。 如果這以后不會在腳本中引起錯誤,則您將有一個無限循環,因為在while的條件下將22評估為true

do...while循環的主體始終至少執行一次。 在第一輪中, i0 ,您將獲得預期的結果。 但是,當第二輪開始時, i等於22 ,因為它在while(i=itemSize)有一個新值。

getElementsByTagName()返回類似數組的對象,該對象具有從零開始的索引,即該item的最大索引為21 在循環的第二輪中,您嘗試使用undefined getElementsByTagName方法( item[22].getElementsByTagName(...)... ,這會導致錯誤消息。

循環中還存在命名沖突(原始item列表已替換為DOM元素),盡管這可能只是帖子中的錯字。 但是,如果變量將被重命名,則索引問題仍然存在。

我建議你使用for循環,而不是do...while ,為了以防萬一,就不會有任何項目item

for (i = 0; i < itemSize; i++) {
    list[i] = item[i].getElementsByTagName("title")[0].firstChild.nodeValue;
    itemEl = document.createElement("div"); // renamed the variable
    itemEl.innerHTML = list[i];
    articleList.appendChild(itemEl);
}
xmlhttp.onreadystatechange = function () {

              if (this.readyState == 4)

                  if( this.status == 200) {
                  response = xmlhttp.responseXML;
                  var channel = response.documentElement;
                  var title = channel.getElementsByTagName("title")[0].firstChild.nodeValue;

                  var parent =  document.getElementById("journalTitle");
                  parent.innerHTML = title;

                  var articleList = document.getElementById("articleList");

                  item = channel.getElementsByTagName("item");
                  var list = new Array();
                  itemSize = (channel.getElementsByTagName("item").length);
                  var i =0;
                  do{

                      list[i] = item[i].getElementsByTagName("title")[0].firstChild.nodeValue;

                      item = document.createElement("div");
                      item.innerHTML = list[i];
                      articleList.appendChild(item);
                      i++;


                  }while(i=itemSize);

                } 
} /*<---missing bracket here*/

我發現我的問題太荒謬了。 盡管一陣子不正確,但是for還是沒有用。 問題是我對同一名稱item使用了不同的變量。 當我像這樣更改代碼時,問題就解決了:

xmlhttp.onreadystatechange = function () {

          if (this.readyState == 4)

              if( this.status == 200) {
              response = xmlhttp.responseXML;
              var channel = response.documentElement;
              var title = channel.getElementsByTagName("title")[0].firstChild.nodeValue;

              var parent =  document.getElementById("journalTitle");
              parent.innerHTML = title;

              var articleList = document.getElementById("articleList");

              item = channel.getElementsByTagName("item");
              var list = new Array();
              itemSize = (channel.getElementsByTagName("item").length);

              for (i = 0;i<itemSize;i++){

                  list[i] = item[i].getElementsByTagName("title")[0].firstChild.nodeValue;

                  itemD = document.createElement("div");
                  itemD.innerHTML = list[i];
                  articleList.appendChild(itemD);


              }

            } 
 } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM