循环不'不能在“onreadystatechange”中工作

loop doesn't work inside `onreadystatechange`

本文关键字:onreadystatechange 工作 不能 循环      更新时间:2024-06-18

这是我的代码:

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);时,它会向我显示第五个元素,依此类推,但在循环中,它只理解其余项目的第一个元素,它返回错误:

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。在循环的第二轮中,您试图使用undefinedgetElementsByTagName方法(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也不起作用。问题是我使用了名称相同的不同变量CCD_ 26。当我这样更改代码时,问题就解决了:

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);

              }
            } 
 } 
相关文章:
  • 没有找到相关文章