DOM позволяет нам делать что угодно с элементами и их содержимым, но сначала нам нужно достичь соответствующего объекта DOM. Все операции с DOM начинаются с объекта document
. Из него мы можем получить доступ к любому узлу.
Самые верхние узлы дерева доступны напрямую как document
свойства:
<html>
= document.documentElement
Самый верхний узел документа - document.documentElement
. Это узел DOM тега <html>
.
<body>
= document.body
Другой широко используемый узел DOM - это элемент <body>
- document.body
.
<head>
= document.head
Тег <head>
доступен как document.head
.
С этого момента мы будем использовать два термина:
- Дочерние узлы (или дочерние узлы) - элементы, которые являются прямыми дочерними элементами. Другими словами, они вложены именно в данную. Например,
<head>
и<body>
являются дочерними элементами элемента<html>
. - Потомки - все элементы, вложенные в данный, включая дочерние элементы, их дочерние элементы и так далее.
Свойства firstChild
и lastChild
обеспечивают быстрый доступ к первому и последнему потомкам.
У них просто короткие руки. Если есть дочерние узлы, то всегда верно следующее:
elem.childNodes[0] === elem.firstChild elem.childNodes[elem.childNodes.length - 1] === elem.lastChild
Также есть специальная функция elem.hasChildNodes()
для проверки наличия дочерних узлов.
Как мы видим, childNodes
выглядит как массив. Но на самом деле это не массив, а скорее коллекция - особый итерируемый объект, подобный массиву.
Есть два важных следствия:
Мы можем использовать for..of
для итерации по нему:
for (let node of document.body.childNodes) {
alert(node);
}
Это потому, что он итерируемый (при необходимости предоставляет свойство Symbol.iterator
).
Методы массива работать не будут, потому что это не массив:
alert(document.body.childNodes.filter);
Если мы хотим использовать методы массива
alert( Array.from(document.body.childNodes).filter );
Братья и сестры - это узлы, являющиеся дочерними по отношению к одному и тому же родителю.
Например, здесь <head>
и <body>
- братья и сестры:
<html>
<head>...</head><body>...</body>
</html>
<body>
считается «следующим» или «правильным» братом<head>
,<head>
считается «предыдущим» или «левым» братом<body>
.
Следующий брат находится в свойстве nextSibling
, а предыдущий - в previousSibling
.
Родитель доступен как parentNode
.
Перечисленные выше свойства навигации относятся ко всем узлам. Например, в childNodes
мы можем видеть и текстовые узлы, и узлы элементов, и даже узлы комментариев, если они существуют.
Но для многих задач нам не нужны узлы текста или комментариев. Мы хотим управлять узлами элементов, которые представляют теги и формируют структуру страницы.
Ссылки аналогичны приведенным выше, только со словом Element
внутри:
children
- только те дочерние элементы, которые являются узлами элементов.firstElementChild
,lastElementChild
- первый и последний дочерние элементы.previousElementSibling
,nextElementSibling
- соседние элементы.parentElement
- родительский элемент.