我有一個函數,它是爲了在用一組新的子元素填充div之前清除所有子元素的div。Javascript函數事件不按順序執行
function displaySearchResults(resultsList) {
var length = resultsList.length;
var searchDiv = document.getElementById('search-results');
//CLEAR DIV
if(searchDiv.hasChildNodes()) {
for(var i=0; i<searchDiv.childNodes.length; i++) {
var oldChild = searchDiv.childNodes[i];
if(oldChild.id.indexOf('search-results-row') != -1) {
searchDiv.removeChild(oldChild);
console.log('Removed Result!');
}
}
}
//ADD CHILDREN
for(var i=0; i<length; i++) {
console.log('Added Result!');
var element = resultsList[i];
var rowDiv = document.createElement('div');
rowDiv.id = 'search-results-row' + i;
rowDiv.className = 'list listRow' + i%2;
rowDiv.setAttribute('onclick', 'mapCurrentContact(' + i + ');');
rowDiv.innerHTML = element.firstName + ' ' + element.lastName;
searchDiv.appendChild(rowDiv);
}
}
但是它在CLEAR DIV循環有機會完成之前開始運行函數的ADD CHILDREN部分。因此,例如,如果函數在div中找到4個childNode並開始循環以刪除具有search-results-row的id的每個節點,它只會在它開始附加新的結果集之前通過2次左右最初傳入該函數。
我知道JavaScript是異步運行的,但我認爲函數本身至少會自頂向下運行,所以底部不應該做任何事情,直到我們到達代碼的那部分?我嘗試了各種其他的替代方法,例如在自己的函數中運行CLEAR DIV部分,然後在最後調用ADD CHILDREN部分,但我總是得到相同的結果。我在這裏錯過什麼!?!
我不知道這是不是你的問題,但在明確的div塊,考慮循環下跌,而非上漲。當childNode被移除時,searchDiv.childNode變量的長度會發生變化。 –
你是什麼意思「我知道JavaScript異步運行」?另外,請注意,變量'i'只在該函數中存在一次,而不是在每個'for'循環中都存在一次:這與該函數無關,但它確實會將人員關閉。正如Jeffrey所指出的那樣,您正在跳過子節點。 –
我想我需要一點澄清。我錯過了如何跳過節點,以及我如何不隨着循環的進行而改變...... – ryandlf