循环在`onreadystatechange`中不起作用

时间:2013-12-11 15:45:02

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

Uncaught TypeError: Cannot call method 'getElementsByTagName' of undefined

3 个答案:

答案 0 :(得分:1)

while循环中的条件不是比较任何东西。这是一个定义,将i的值设置为itemSize(根据OP,为22)。如果以后在脚本中不会导致错误,则您会有一个无限循环,因为22true的条件下被评估为while。< / p>

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

getElementsByTagName()返回一个类似数组的对象,该对象具有从零开始的索引,即item中的最大索引为21。在第二轮循环中,您尝试使用getElementsByTagName undefined 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);
}

答案 1 :(得分: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*/

答案 2 :(得分:0)

我发现我的问题太荒谬了。虽然虽然时间不对,但两者都没有。问题是我使用了同名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);


              }

            } 
 }