Кратко
СкопированоHTML
и Node
— это очень похожие на массив коллекции. Они хранят элементы веб-страницы (узлы DOM). Node
может хранить любые типы узлов, а HTML
— только узлы HTML элементов. К элементам коллекций можно обращаться по индексу, но у них нет привычных методов массива.
HTML
возвращают методы get
и get
.
Node
возвращают метод query
и свойство child
.
Полный список всех методов, возвращающих типы Node
или HTML
можно узнать в стандарте DOM.
Как понять
СкопированоHTML
возвращают методы, которые работают с DOM — представлением HTML-кода страницы в JavaScript.
Полученная один раз коллекция всегда остаётся актуальной — JavaScript будет обновлять её в случае, если на странице появляется подходящий элемент. Поэтому HTML
называют «живой» коллекцией.
Например, единожды получив коллекцию мы можем не заботиться о её поддержке:
Node
работает почти так же, как и HTML
.
Разница:
Node
может хранить любые типы узлов, например текстовые узлы и комментарии, аList HTML
— только узлы HTML элементов;Collection HTML
позволяет обращаться к элементам не только по индексу, но и по имени с помощью методаCollection named
;Item Node
может быть не только «живой» коллекцией, но и статической. Такая коллекция не обновляется при появлении на странице новых элементов.List
«Живой» Node
возвращают метод get
и свойство child
.
Статический Node
возвращает метод query
.
На практике
Скопированосоветует Скопировано
🛠 Используй индексы для получения отдельных элементов коллекции:
const paragraphs = document.getElementsByTagName('p')console.log(paragraphs[0])
const paragraphs = document.getElementsByTagName('p') console.log(paragraphs[0])
🛠 Если нужно обойти все элементы в цикле, то можно написать классический цикл for
:
const paragraphs = document.getElementsByTagName('p')for (let i = 0; i < paragraphs.length; ++i) { console.log(paragraphs[i].id) // печатаем значение атрибута id элемента}
const paragraphs = document.getElementsByTagName('p') for (let i = 0; i < paragraphs.length; ++i) { console.log(paragraphs[i].id) // печатаем значение атрибута id элемента }
Другой вариант — воспользоваться синтаксисом for
:
const paragraphs = document.getElementsByTagName('p')for (let item of paragraphs) { console.log(item.id)}
const paragraphs = document.getElementsByTagName('p') for (let item of paragraphs) { console.log(item.id) }
🛠 При создании цикла над HTML
убедитесь, что подходящие элементы не добавляются или удаляются со страницы в момент работы цикла. Так как коллекция живая, её обновление во время цикла может создать бесконечный цикл.
🛠 Если очень нужны методы массива, то преобразуйте HTML
или Node
в массив с помощью Array
.
const paragraphs = document.getElementsByTagName('p')let array = Array.from(paragraphs)console.log(array.pop())
const paragraphs = document.getElementsByTagName('p') let array = Array.from(paragraphs) console.log(array.pop())