2013-08-14 2 views
1

Я хотел бы посетить каждый элемент (используя только JavaScript, ни JQuery или любой другой библиотеки JavaScript) в живом HTMLCollection или NodeList, например, коллекции, возвращаемой var elements = document.getElementsByClassName('class-name');Посетите каждый элемент HTMLCollection/NodeList

Если DOM не меняется, то я могу сделать это с помощью for цикла:

for(var i=0; i<elements.length; i++) 
{ 
    //Do something with elements[i] 
} 

Но что делать в ситуации, когда for цикл по-прежнему работает, и есть добавление или удаление элементов с классом class-name. Если element был удален или добавлен, индексы будут меняться.

Итак, как я могу убедиться, что в то время как петля for работает, нет element в elements отсутствует только с использованием JavaScript.

+0

Если DOM изменяется, это связано с тем, что код, который у вас есть в вашем цикле, меняет его. Вы не можете отслеживать изменения, которые вы делаете? –

+0

Что делать, если есть другой скрипт, который меняет DOM? –

+3

Это отчасти зависит от того, что вы делаете. Одним из возможных решений было бы сделать копию NodeList в простой массив JavaScript. * edit * Нельзя запускать какой-либо другой скрипт во время работы вашего цикла; JavaScript не работает таким образом (в любом случае, в браузере). – Pointy

ответ

3

В данный момент работает только один скрипт. Единственные изменения, которые могут произойти с DOM во время работы вашего скрипта, - это те, которые сделаны вашим скриптом. Все остальные задачи, события и т. Д. Будут терпеливо ждать завершения вашего сценария.

Так что

  • не беспокоиться за внешние изменения в DOM, есть ни
  • отслеживать изменения код из

и вы будете в порядке.

0

Насколько я знаю, цикл for не является асинхронным, поэтому элементы не могут меняться, поскольку цикл for полностью выполняется до того, как произойдет изменение d, или изменение должно произойти до цикла for.

+2

Это неправда с NodeList. Это «живые», поэтому активность в цикле (изменения в DOM) может привести к увеличению или потерям элементов списка. – Pointy

0

«Живые» коллекции - просто неудобные дефолты, которые продолжают удивлять людей. Я предлагаю вам просто использовать querySelectorAll, который не только поддерживается больше, чем gEBCN, но и возвращает моментальный снимок вместо «живой» коллекции.

Я вижу, что даже представление о том, что коллекция «живое» вызывает путаницу. Это не живое, но в основном свойства являются геттерами, например. [i] фактически вызывает .item(i) - метод динамически извлекает элемент, который заставляет коллекцию отображаться вживую.

И еще есть. Некоторые люди продолжают использовать эти методы, потому что ошибочно считают, что они значительно быстрее из-за нарушенных контрольных показателей. В этих тестах сравниваются только прямые вызовы методов, и не считается, что «живые» коллекции не выполняют никакой работы, пока вы не попытаетесь извлечь элементы.

Смежные вопросы