循环不'不能在“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);
时,它会向我显示第五个元素,依此类推,但在循环中,它只理解其余项目的第一个元素,它返回错误:
Uncaught TypeError: Cannot call method 'getElementsByTagName' of undefined
while
循环中的条件没有进行任何比较。这是一个定义,将i
的值设置为itemSize
(根据OP为22)。如果这不会在稍后的脚本中导致错误,那么您将有一个无限循环,因为在while
的条件下,22
被求值为true
。
do...while
循环的主体总是至少执行一次。在第一轮中,i
是0
,您可以得到预期的结果。然而,当第二轮开始时,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也不起作用。问题是我使用了名称相同的不同变量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);
}
}
}
- 没有找到相关文章