hellojs.ru
Главная - Основы JavaScript - Навигация по DOM - элементам, data-атрибуты, преимущество for/of

Навигация по DOM - элементам, data-атрибуты, преимущество for/of

Размещено в категории "Основы JavaScript"
04.10.2024 / просмотров: 42 / комментариев: 0
Ресурсы:

Про data-атрибуты




Представим, что есть задача: взять определённый элемент и обратиться к его родителю, или к следующему элементу и у них поменять класс.

Для теста используем такую структуру:

Код

<div class="wrapper">
  <div class="first">
  <button></button>
  <button id="current"></button>
  <button></button>
  </div>
  <div class="second">
  <ul>
  <li>1</li>
  <li>2</li>
  <li data-current="3">3</li>

  <li>4</li>
  <li>5</li>
  </ul>
  </div>
  <div class="third"></div>
</div>

<script src="script.js"></script>

Так можно получить главные элементы DOM-дерева:

Код

console.log(document.body);
console.log(document.head);
console.log(document.documentElement); // html

console.log(document.body.childNodes); // получить дочерние узлы для body  

Результатом последней команды будет псевдомассив

Цитата

NodeList(4) [text, div.wrapper, text, script]

Первая текстовая нода (text) расположена между родительской оболочкой (body) и элементом wrapper, это обычный перенос строки и он считается текстовой нодой.

Дальше в псевдомассиве идёт элемент wrapper, после этого опять текстовая нода переноса строки и дальше script

Каждая сущность на странице по факту является узлом,но не каждый узел будет элементом. Всё, что заключено в теги - это элементы.

Код

console.log(document.body.firstChild); // получить первого ребенка для родителя
console.log(document.body.lastChild); // получить последнего ребенка для родителя  

Рассмотрим как получить родителя, соседей и детей:

Код

console.log(document.querySelector('#current').parentNode);  

В консоли получаем родительский элемент с классом first

Цитата

<div class="first">...</div>

Если же продублировать команду дважды:

Код

console.log(document.querySelector('#current').parentNode.parentNode);

то получим уже элемент с классом wrapper

Data-атрибуты



Название атрибута всегда начинаем с ключевого слова data, затем идёт произвольное название и значение, как булиновое, так и физическое.

Код

data-current = '3'  
data-modal
data-close

Как их получать в коде:

Код

console.log(document.querySelector('[data-current="3"]'));

Получить следующий за ним элемент:

Код

console.log(document.querySelector('[data-current="3"]').nextSibling);

В консоли мы получим текстовую ноду переноса строки.

А так можно получить элемент, который стоит перед ним:

Код

console.log(document.querySelector('[data-current="3"]').previousSibling);

И это тоже будет текстовая нода переноса строки.

А как же получать именно элементы, минуя ноды?

Код

console.log(document.querySelector('#current').parentElement);
console.log(document.body.firstElementChild);
console.log(document.body.lastElementChild);
console.log(document.querySelector('[data-current="3"]').nextElementSibling);
console.log(document.querySelector('[data-current="3"]').previousElementSibling);

Аналогичного метода для childNodes нет, но можно использовать метод перебора for/of, за счёт которого мы переберём все сущности в body и избавимся от текстовых нод

Код

for (let node of document.body.childNodes) {
  if (node.nodeName == '#text') {
  continue; // пропускаем текстовую ноду
  }
  console.log(node);
}  
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
Сайт управляется системой uCoz