Проблема в том, что коллекции DOM live , и когда базовая структура документа изменяется, это автоматически отражается на коллекции, поэтому, когда свойство length
доступ к нему будет содержать новую длину, общий подход - кэш длина до начала цикла:
var divs=document.getElementsByTagName('div');
for(var i = 0, len = divs.length;i<len;i++){
var newDiv = document.createElement('div');
divs[i].appendChild(newDiv);
}
Также обратите внимание, что вы должны объявить все свои переменные с помощьюоператор var
, в противном случае он может стать глобальным.
Редактировать: В этом случае, поскольку вы добавляете дочерние узлы с одним и тем же tagName, коллекция будет изменена,и индексы больше не будут совпадать с , после первой итерации индекс 1
будет ссылаться на объект newDiv
из предыдущей итерации, поскольку @ Casey рекомендует, чтобы это былобезопаснее преобразовать коллекцию в простой массив перед ее обходом.
Я использую следующую функцию:
function toArray(obj) {
var array = [];
// iterate backwards ensuring that length is an UInt32
for (var i = obj.length >>> 0; i--;) {
array[i] = obj[i];
}
return array;
}
//...
var divs = toArray(document.getElementsByTagName('div'));
//...