这是我的代码:
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
答案 0 :(得分:1)
while
循环中的条件不是比较任何东西。这是一个定义,将i
的值设置为itemSize
(根据OP,为22)。如果以后在脚本中不会导致错误,则您会有一个无限循环,因为22
在true
的条件下被评估为while
。< / p>
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);
}
答案 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);
}
}
}