Навигация по дереву DOM
Встроенные методы поиска используются для непосредственного обращения к элементам страницы. Но бывают случаи, когда к элементу нельзя обратиться напрямую (например, если на момент написания скрипта сам элемент не определён однозначно). В таких случаях можно воспользоваться внутренними свойствами узлов дерева, которые содержат ссылки на родственные узлы.
Обращение к родственным узлам
Каждый узел DOM дерева обязательно имеет один родительский узел и может иметь произвольное количество сестринских и дочерних узлов. Для обращения к этим родственным узлам используются встроенные свойства. Ссылки на узлы автоматически меняются при изменении дерева DOM.
parentNode
Свойство parentNode
содержит ссылку на родительский узел. Например, для элемента <body>
родительским является узел <html>
, для которого, в свою очередь, родительским является узел document
.
<html> <head> <title>DOM интерфейс</title> </head> <body> <p>Lorem ipsum dolor...</p> </body> </html> <script> var body = document.body; alert(body.parentNode); /* HTML элемент */ alert(body.parentNode.parentNode); /* объект DOCUMENT */ </script>
childNodes
, firstChild
, lastChild
Свойство childNodes
содержит список всех дочерних узлов, которые присутствуют в дереве DOM на момент выполнения скрипта. Свойства firstChild
и lastChild
ссылаются соответственно на первый и последний элемент из этого списка, то есть всегда верно:
element.firstChild === element.childNodes[0]; element.lastChild === element.childNodes[element.childNodes.length - 1];
<html> <head> <title>DOM интерфейс</title> <script> var html = document.documentElement; alert(html.childNodes.length); /* 1 узел (HEAD) */ alert(html.firstChild); /* узел HEAD */ alert(html.lastChild); /* узел HEAD */ </script> </head> <body> <p>Lorem ipsum dolor...</p> </body> </html> <script> alert(html.childNodes.length); /* 3 узла (HEAD, перенос строки, BODY) */ alert(html.firstChild); /* узел HEAD */ alert(html.lastChild); /* узел BODY */ </script>
previousSibling
, nextSibling
Свойства previousSibling
и nextSibling
используются для обращения к сестринским узлам. Они ссылаются соответственно на предыдущий и последующий узлы дерева внутри общего родителя.
<html> <head> <title>DOM интерфейс</title> </head> <body> <p>Lorem ipsum dolor...</p> </body> </html> <script> var body = document.body; alert(body.previousSibling); /* текстовый узел (перенос строки) */ alert(body.nextSibling); /* null (после BODY узлы не создаются) */ </script>
Обращение к родственным элементам
Предыдущие свойства позволяют обратиться к родственным узлам элемента без учёта их типа (текст
, элемент
, комментарий
). На практике эти свойства почти не используются, так как не все из этих узлов относятся к содержимому страницы.
Для работы только с узлами элементами
применяются свойства, схожие с предыдущими. Все ссылки автоматически меняются при изменении DOM структуры документа.
parentElement
Свойство parentElement
содержит ссылку на родительский элемент. Для элемента <body>
родительским является элемент <html>
. Элемент <html>
является корневым узлом элементом
, поэтому он не имеет родительского элемента.
<html> <head> <title>DOM интерфейс</title> </head> <body> <p>Lorem ipsum dolor...</p> </body> </html> <script> var body = document.body; alert(body.parentElement); /* HTML элемент */ alert(body.parentElement.parentElement); /* null */ </script>
children
, firstElementChild
, lastElementChild
Свойство children
содержит список всех дочерних узлов элементов
, которые присутствуют в дереве DOM на момент выполнения скрипта. Свойства firstElementChild
и lastElementChild
ссылаются соответственно на первый и последний элемент из этого списка, то есть всегда верно:
element.firstElementChild === element.children[0]; element.lastElementChild === element.children[element.children.length - 1];
<html> <head> <title>DOM интерфейс</title> <script> var html = document.documentElement; alert(html.children.length); /* 1 элемент (HEAD) */ alert(html.firstElementChild); /* элемент HEAD */ alert(html.lastElementChild); /* элемент HEAD */ </script> </head> <body> <p>Lorem ipsum dolor...</p> </body> </html> <script> alert(html.children.length); /* 2 элемента (HEAD, BODY) */ alert(html.firstElementChild); /* элемент HEAD */ alert(html.lastElementChild); /* элемент BODY */ </script>
previousElementSibling
, nextElementSibling
Свойства previousElementSibling
и nextElementSibling
используются для обращения к сестринским элементам. Они ссылаются соответственно на предыдущий и последующий узлы элементы
дерева внутри общего родителя.
<html> <head> <title>DOM интерфейс</title> </head> <body> <p>Lorem ipsum dolor...</p> </body> </html> <script> var body = document.body; alert(body.previousElementSibling); /* элемент HEAD */ alert(body.nextElementSibling); /* null */ </script>