Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Непонятка с HTMLCollection (https://javascript.ru/forum/misc/57262-neponyatka-s-htmlcollection.html)

Palama 27.07.2015 15:35

Непонятка с HTMLCollection
 
Исходное:
есть хтмл вида
<li>текст1</li>
<li>текст2</li>
.....
<li>текст3</li>


мне нужно получить его, обработать каждую строку и вставить на страничку.

скрипт.
var tmp_holder = document.createElement('div'),   // временное хранилище
      workfield = document.getElementById('workfield'); // место куда вставить
tmp_holder.innerHTML = xmlhttp.responseText;   // полученный хмтл
var Lx = tmp_holder.getElementsByTagName('LI');
for (i = 0; i < Lx.length; i++) workfield.appendChild(Lx[i]);


вывод получается вида
текст1
текст3
текст5
т.е. через один

wft? :-E

Если скопировать мой HTMLCollection в массив из HTMLElement, то всё работает как надо, что ожидаемо.
var Nx =[];
for (i = 0; i < Lx.length; i++) Nx[i] = Lx[i];
for (i = 0; i < Nx.length; i++) workfield.appendChild(Nx[i]);



Что происходит с коллекцией при вставке элементов из неё? Куда пропадают элементы?

Palama 27.07.2015 15:43

а если заменить на
var Lx = tmp_holder.querySelectorAll('LI');

то всё баг исчезает.

В чем разница между getElementsByTagName(tagname) и querySelectorAll(tagname)?

Palama 27.07.2015 15:57

Сам же и отвечу, пока писал додумался.
appendChild перемещает элемент из коллекции, соответственно после первого мой цикл обратится к третьему элементу и length в конце цикла будет вдвое меньше, так как половина элементов будет перемещено.

Всем спасибо :)

ruslan_mart 27.07.2015 19:25

workfield.appendChild(Lx[i].cloneNode(true));

рони 27.07.2015 20:18

Palama,
for (; Lx[0];) workfield.appendChild(Lx[0]);


Часовой пояс GMT +3, время: 20:58.