Доступ к элементам HTML-документа: обзор методов и примеры

Раздел: Веб-разработка -> DOM

Получение элементов DOM в JavaScript

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

Как получить элемент DOM с помощью универсального метода querySelector?

Метод document.querySelector(selector) возвращает первый элемент, соответствующий переданному CSS-селектору. Это основной способ, так как он позволяет использовать любые селекторы, поддерживаемые CSS. Если элемент не найден, возвращается null.

// Получить элемент с id="header"
const header = document.querySelector('#header');
// Получить первый элемент с классом "menu"
const menu = document.querySelector('.menu');
// Получить первый элемент <div> внутри <article>
const articleDiv = document.querySelector('article div');

Dom js (dom в javascript)

Пояснение: Строка селектора пишется точно так же, как в CSS. Метод удобен для единичного элемента. Для получения всех элементов используется querySelectorAll.

Типичные ошибки: Если селектор написан с ошибкой (например, лишний пробел), будет выброшено исключение. Всегда стоит оборачивать вызов в проверку на null, чтобы избежать ошибок при обращении к свойствам несуществующего элемента.

Когда использовать: Когда нужен один элемент и известен CSS-селектор (id, класс, атрибут, псевдокласс и т.д.). Это предпочтительный метод в современных проектах.

Как получить элемент по идентификатору (getElementById)?

Метод document.getElementById(id) возвращает элемент с указанным id. Это самый быстрый способ поиска по id, так как браузер хранит индекс id.

const logo = document.getElementById('logo');

Javascript document (объект document в javascript)

Проблемы: id должен быть уникальным на странице. Если id нет, возвращается null. Нельзя искать по классу или тегу.

Когда использовать: Когда точно известен id элемента и требуется максимальная производительность (например, в циклах или при обработке событий).

Как получить коллекцию элементов по имени класса (getElementsByClassName)?

Метод document.getElementsByClassName(name) возвращает живую коллекцию (HTMLCollection) всех элементов, имеющих заданный класс (или несколько классов, разделённых пробелами).

const items = document.getElementsByClassName('item');
// Коллекция живая: при добавлении нового элемента с классом "item" она автоматически обновится.
console.log(items.length); // количество элементов

Js кнопка (создание и обработка кнопок в javascript)

Типичные ошибки: Коллекция не является массивом, поэтому методы массива (forEach, map) не работают напрямую. Нужно преобразовать её в массив: Array.from(items) или использовать [...items].

Когда использовать: Когда нужно получить все элементы с определённым классом, и требуется, чтобы коллекция автоматически обновлялась при изменениях DOM (живая коллекция).

Как получить коллекцию элементов по тегу (getElementsByTagName)?

Метод document.getElementsByTagName(tagName) возвращает живую HTMLCollection всех элементов с указанным именем тега.

const paragraphs = document.getElementsByTagName('p');
const firstPara = paragraphs[0];

Javascript nodes (javascript nodes (узлы))

Проблемы: Аналогично предыдущему, коллекция живая и не является массивом. Поиск по тегу может быть медленнее, чем по id.

Когда использовать: Когда нужно обработать все элементы определённого типа (например, все ссылки <a> или все параграфы).

Как получить все элементы по CSS-селектору (querySelectorAll)?

Метод document.querySelectorAll(selector) возвращает статическую NodeList всех элементов, соответствующих селектору. В отличие от живых коллекций, NodeList не обновляется при изменении DOM.

// Все элементы с классом "highlight"
const highlights = document.querySelectorAll('.highlight');
// Все ссылки внутри навигации
const navLinks = document.querySelectorAll('nav a');

Javascript следующий (javascript: получение следующего элемента)

Типичные ошибки: NodeList поддерживает forEach, но не поддерживает map, filter и другие методы массива. Для полного функционала массива его можно преобразовать. Также следует помнить, что если селектор не найден, возвращается пустая NodeList, а не null (в отличие от querySelector).

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

Как получить формы или изображения через встроенные коллекции?

В документе существуют специальные коллекции, такие как document.forms, document.images, document.links, document.scripts. Они возвращают живую HTMLCollection соответствующих элементов.

const allForms = document.forms; // все формы
const firstForm = document.forms[0]; // первая форма
const allImages = document.images; // все изображения

Javascript element (javascript: получение элемента dom)

Проблемы: Эти коллекции доступны только для основных типов элементов. Нельзя использовать для произвольных селекторов.

Когда использовать: Когда требуется быстро получить все формы, изображения или ссылки на странице без написания селектора. Удобно для итерации.

Как найти ближайшего родителя по селектору (closest)?

Метод element.closest(selector) ищет ближайший родительский элемент (включая сам элемент), который соответствует CSS-селектору. Возвращает первый подходящий элемент или null, если такого нет.

const btn = document.querySelector('.btn');
const form = btn.closest('form'); // найти родительскую форму
Типичные ошибки: Если элемент находится вне подходящего родителя, возвращается null. Метод не работает с псевдоклассами.

Когда использовать: В обработчиках событий для поиска контейнера, в котором находится целевой элемент (например, найти строку таблицы по кликнутой ячейке).

- Js содержимое (содержимое элементов javascript)

Расширенные примеры получения DOM-элементов

Пример 1. Использование псевдоклассов в querySelector

Псевдоклассы позволяют выбирать элементы по их состоянию. Например, :not, :nth-child, :first-of-type.

Пример
// Получить первый элемент среди всех, не имеющих класс "hidden"
const firstVisible = document.querySelector(':not(.hidden)');
// Получить второй <li> в списке
const secondItem = document.querySelector('ul li:nth-child(2)');
// Получить последний <p> внутри <div>
const lastParagraph = document.querySelector('div p:last-of-type');
// Результат: первый элемент, не скрытый, второй пункт списка, последний параграф (если существуют)

Пример 2. Поиск внутри конкретного элемента

Методы querySelector и querySelectorAll можно вызывать не только на document, но и на любом элементе. Это ограничивает область поиска.

Пример
const container = document.getElementById('container');
const innerSpan = container.querySelector('span'); // только внутри контейнера
const allButtons = container.querySelectorAll('.btn'); // все кнопки внутри контейнера
// Если в контейнере нет span - null; если есть кнопки - NodeList

Пример 3. Атрибутные селекторы

Можно искать элементы по значениям атрибутов: [data-*], [href^="https"], [type="submit"].

Пример
// Все элементы с data-атрибутом
const dataElements = document.querySelectorAll('[data-*]');
// Ссылки, начинающиеся с https
const secureLinks = document.querySelectorAll('a[href^="https"]');
// Кнопки типа submit
const submitButtons = document.querySelectorAll('input[type="submit"]');
// Возвращаются NodeList соответствующих элементов

Пример 4. Несколько классов и комбинации

Можно комбинировать классы, идентификаторы и теги: .class1.class2, div#id, ul > li.active

Пример
// Элемент с двумя классами
const doubleClass = document.querySelector('.item.active');
// Прямой потомок
const directChild = document.querySelector('ul > li');
// Соседний элемент
const adjacent = document.querySelector('h2 + p'); // параграф сразу после h2
// В результате - первый подходящий элемент или null

Пример 5. Работа с живыми коллекциями и преобразование в массив

Живые коллекции (HTMLCollection) не имеют методов массива. Чтобы использовать map, filter и reduce, их преобразуют в массив.

Пример
const divs = document.getElementsByTagName('div');
const divArray = Array.from(divs);
// или const divArray = [...divs];
const texts = divArray.map(div => div.textContent);
// texts - массив текстового содержимого всех div

Пример 6. Получение элементов в Shadow DOM

Если веб-компонент использует Shadow DOM, элементы внутри shadowRoot не видны из document.querySelector. Доступ к ним осуществляется через свойство shadowRoot.

Пример
const host = document.querySelector('my-component');
const shadow = host.shadowRoot;
const shadowButton = shadow.querySelector('.inner-button');
// shadowButton - элемент внутри Shadow DOM

Пример 7. Фильтрация с помощью matches()

Метод element.matches(selector) проверяет, соответствует ли элемент CSS-селектору. Его можно использовать для фильтрации коллекции.

Пример
const allItems = document.querySelectorAll('li');
// Оставить только те, у которых есть класс "active"
const activeItems = Array.from(allItems).filter(item => item.matches('.active'));
// activeItems - массив элементов с классом active

Пример 8. Комбинированный поиск с использованием closest

В обработчиках событий часто требуется найти ближайшего родителя с определённым классом.

Пример
document.addEventListener('click', function(e) {
  const row = e.target.closest('.data-row');
  if (row) {
    console.log('Кликнут ряд:', row);
  }
});
// Если клик произошёл внутри .data-row, будет выведен этот элемент; иначе ничего.

JavaScript: получение элемента DOM - comments

En
Javascript element (javascript)