0

这是我的代码:

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 的第一个元素,其余的它返回错误:

Uncaught TypeError: Cannot call method 'getElementsByTagName' of undefined

4

3 回答 3

1

您在while循环中的条件没有比较任何内容。这是一个定义,设置ito的值itemSize(根据 OP 为 22)。如果这不会导致脚本稍后出现错误,那么您将有一个无限循环,22因为truewhile.

循环体do...while总是至少执行一次。在第一轮,i0,你得到了预期的结果。但是,当第二轮开始时,i等于22,因为它在 中获得了新值while(i=itemSize)

getElementsByTagName()返回一个类似数组的对象,该对象具有从零开始的索引,即itemis中的最大索引21。在第二轮循环中,您尝试使用(的getElementsByTagName方法,这会导致错误消息。undefineditem[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);
}
于 2013-12-12T19:50:23.653 回答
0
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*/
于 2013-12-11T15:52:03.680 回答
0

我发现我的问题太荒谬了。虽然 while 不正确,但 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);


              }

            } 
 } 
于 2013-12-14T22:11:19.790 回答