Навигация по дереву 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>