0

вот мой код:цикл не работает в `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

+1

'while (i = itemSize)' ??? – Teemu

+0

что я должен писать вместо этого? – Paniz

+0

Я использовал, и он не работал, поэтому я изменил 'for' на' while'. проблема должна быть еще :( – Paniz

ответ

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


       } 

      } 
} 
+0

Чтобы быть точным, я упомянул переменные с таким же именем в моем ответе, которые были опубликованы два дня назад ... – Teemu

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*/ 
+0

скобки в порядке. Я просто здесь не показывал – Paniz

1

Ваше состояние вЦиклничего не сравнивает. Это определение, устанавливающее значение i - itemSize (что соответствует 22 согласно OP). Если это не приведет к ошибке позже в скрипте, у вас будет бесконечный цикл, так как 22 оценивается в true в состоянии while.

Тело цикла do...while всегда выполняется хотя бы один раз. В первом раунде i - 0, и вы получите ожидаемые результаты. Однако, когда начинается второй раунд, 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); 
}