Удаляет ли изменение атрибутов объекта DOM в массиве этот объект из массива? - PullRequest
3 голосов
/ 30 октября 2011

Я получаю массив объектов DOM, используя getElementsByClassName:

a = document.getElementsByClassName("foo");  

На этом этапе предположим, что a.length равно 3.Затем, во время вызова некоторой функции, я хочу переключить атрибуты некоторых из этих объектов, изменив их имена классов.Например, я изменяю имя класса a[0]:

a[0].className = "bar";

Кажется, что объект, который только что был назван a[0], теперь удален из a.a.length сейчас 2.

Мне интересно, почему это произошло.Я определил a на этот раз, но более поздние модификации его элементов, похоже, влияют на членство в a.Может кто-нибудь объяснить это?

Ответы [ 2 ]

5 голосов
/ 30 октября 2011

Согласно спецификации NodeList (разновидность магического массива), которую вы получаете: live .

Объекты NodeList и NamedNodeMap в DOM: live ; то есть изменения в базовой структуре документа отражаются во всех соответствующих объектах NodeList и NamedNodeMap.

Например, если пользователь DOM получает объект NodeList, содержащий дочерние элементы элемента, а затем добавляет дополнительные дочерние элементы к этому элементу (или удаляет дочерние элементы, или изменяет их), эти изменения автоматически отражаются в NodeList. , без дальнейших действий со стороны пользователя.

3 голосов
/ 30 октября 2011

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

a= [].slice.call(a,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...