Как вы знаете, теги могут содержать другие теги или, говоря в терминах JavaScript, DOM элементы могут содержать другие DOM элементы. Кроме этого, однако, в них могут быть комментарии и обычный текст. Комментарии, тексты и DOM элементы объединяют одним названием - узлы.
Вам уже знакомы свойства firstElementChild
,
lastElementChild
,
nextElementSibling
,
previousElementSibling
.
Эти свойства работают именно с DOM элементами,
игнорируя остальные узлы. Как правило, именно
это нам и требуется.
Однако, существуют также свойства firstChild
,
lastChild
, nextSibling
, previousSibling
.
Эти свойства работают аналогичным образом,
однако, учитывая все узлы. Давайте посмотрим
разницу между этими свойствами на примере.
Пусть у нас есть див, содержащий в себе три узла:
<div id="elem"><!--сomm-->text<span>tag</span></div>
Получим ссылку на этот див в переменную:
let elem = document.querySelector('#elem');
А теперь давайте посмотрим, что содержится
в свойствах firstChild
и firstElementChild
:
console.log(elem.firstChild); // комментарий
console.log(elem.firstElementChild); // тег span
Напишите код, который покажет разницу между
lastChild
и lastElementChild
.
Напишите код, который покажет разницу между
nextSibling
и nextElementSibling
.
Напишите код, который покажет разницу между
previousSibling
и previousElementSibling
.
Перебор циклом
Как вы уже должны знать, в свойстве children
содержатся все DOM элементы, являющиеся непосредственными
потомками данного элемента. Существует аналогичное
свойство childNodes
, которое содержит
в себе все потомки-узлы элемента.
Давайте, например, с помощью этого свойства выведем различные узлы из нашего элемента:
console.log(elem.childNodes[0]);
console.log(elem.childNodes[1]);
console.log(elem.childNodes[2]);
А теперь давайте переберем узлы элемента циклом:
for (let node of elem.childNodes) {
console.log(node);
}
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и выведите их в консоль.
Название узлов
Все узлы имеют свойство nodeName
.
Для комментария оно содержит значение 'comment'
,
для текстового узла - значение 'text'
,
а для узла-элемента - имя тега в верхнем
регистре. Получается, что nodeName для элементов
аналогичен свойству tagName
,
но работает также и для других типов узлов.
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и выведите в консоль их названия.
Тип узлов
Все узлы имеют свойство nodeType
.
Его значение числовое: 1
для элементов,
3
для текстовых узлов, 8
для
комментариев. Остальные значения в настоящее
время или малоиспользуемы, или устарели.
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и выведите в консоль только узлы-элементы и текстовые узлы.
Текст узлов
Давайте теперь разберемся, как прочитать
или изменить текст узлов. Для всех узлов
работает свойство textContent
. Для
текстовых узлов и комментариев есть свойства
nodeValue
и data
(они практически
одинаковые, второе - короче, лучше пользоваться
им). Для элементов есть свойство innerHTML
,
прочитывающее текст вместе с тегами.
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и выведите в консоль тексты всех узлов.
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и выведите в консоль тексты всех комментариев и текстовых узлов.
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и выведите в консоль тексты текстовых узлов и элементов.
Дан див:
<div id="elem">txt<b>tag</b><!--com-->txt<b>tag</b><!--com--></div>
Переберите циклом все узлы этого дива и каждому узлу в конец запишите его тип.