[英]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);
它向我顯示了第五個元素,依此類推,但是在循環中,它僅了解item的第一個元素,其余的它返回error:
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還是沒有用。 問題是我對同一名稱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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.