DOM (Document Object Model) - это программный интерфейс для HTML и XML документов. Он представляет структуру документа в виде дерева объектов, где каждый узел является объектом, представляющим часть документа. DOM позволяет JavaScript взаимодействовать с HTML: читать, изменять, добавлять и удалять элементы.
1. Поиск элементов в DOM
getElementById() - поиск по id
// HTML: <div id="header">Заголовок</div>
const header = document.getElementById('header');
console.log(header); // Получим элемент с id="header"getElementsByClassName() - поиск по классу
// HTML: <div class="item">Пункт 1</div><div class="item">Пункт 2</div>
const items = document.getElementsByClassName('item');
console.log(items); // HTMLCollection элементов с классом "item"
console.log(items[0]); // Первый элемент с классом "item"getElementsByTagName() - поиск по тегу
// HTML: <p>Параграф 1</p><p>Параграф 2</p>
const paragraphs = document.getElementsByTagName('p');
console.log(paragraphs); // HTMLCollection всех элементов <p>querySelector() - поиск с помощью CSS-селектора
// Находит первый элемент, соответствующий селектору
const firstItem = document.querySelector('.item');
const firstLink = document.querySelector('a[target="_blank"]');
const container = document.querySelector('#container .inner');querySelectorAll() - поиск всех элементов по CSS-селектору
// Находит все элементы, соответствующие селектору
const allItems = document.querySelectorAll('.item');
const allLinks = document.querySelectorAll('nav a');2. Манипуляция содержимым элементов
textContent и innerText - работа с текстом
const element = document.getElementById('myElement');
// Получить текст
const text = element.textContent;
// Установить текст
element.textContent = 'Новый текст';
element.innerText = 'Другой текст'; // Учитывает стили отображения
// Разница между textContent и innerText:
// textContent возвращает весь текст, включая скрытый
// innerText учитывает стили отображения и не возвращает текст скрытых элементовinnerHTML - работа с HTML-содержимым
const container = document.getElementById('container');
// Получить HTML
const html = container.innerHTML; // "<span>Текст</span>"
// Установить HTML
container.innerHTML = '<strong>Жирный текст</strong>';
// Добавить HTML к существующему
container.innerHTML += '<em>Добавленный текст</em>';outerHTML - получение HTML элемента включая сам элемент
const elem = document.querySelector('.my-class');
console.log(elem.outerHTML); // "<div class='my-class'>Содержимое</div>"3. Работа с атрибутами и классами
Атрибуты
const link = document.querySelector('a');
// Получить атрибут
const href = link.getAttribute('href');
// Установить атрибут
link.setAttribute('href', 'https://example.com');
link.setAttribute('target', '_blank');
// Проверить наличие атрибута
const hasClass = link.hasAttribute('class');
// Удалить атрибут
link.removeAttribute('target');
// Получить все атрибуты
const attributes = link.attributes;Классы
const element = document.getElementById('myElement');
// Добавить класс
element.classList.add('new-class', 'another-class');
// Удалить класс
element.classList.remove('old-class');
// Переключить класс (добавить если нет, удалить если есть)
element.classList.toggle('active');
// Проверить наличие класса
const hasClass = element.classList.contains('active');
// Заменить класс
element.classList.replace('old-class', 'new-class');4. Создание и удаление элементов
Создание элементов
// Создать новый элемент
const newDiv = document.createElement('div');
const newParagraph = document.createElement('p');
// Добавить содержимое
newDiv.textContent = 'Новый div элемент';
newParagraph.innerHTML = 'Параграф с <strong>жирным</strong> текстом';
// Добавить атрибуты
newDiv.setAttribute('id', 'new-div');
newDiv.className = 'container highlight';Добавление элементов в DOM
const container = document.getElementById('container');
// append() - добавляет элементы или текст в конец
container.append(newDiv, 'Текст после div');
// appendChild() - добавляет один элемент в конец
container.appendChild(newParagraph);
// prepend() - добавляет элементы или текст в начало
container.prepend('Текст в начале', newDiv.cloneNode());
// insertBefore() - вставляет элемент перед указанным
const referenceElement = document.querySelector('.reference');
container.insertBefore(newDiv, referenceElement);
// insertAdjacentHTML() - вставляет HTML в указанное положение
container.insertAdjacentHTML('beforeend', '<span>В конце</span>');
// Позиции: beforebegin, afterbegin, beforeend, afterendУдаление элементов
const element = document.getElementById('to-remove');
// Удалить элемент через родителя
element.parentNode.removeChild(element);
// Более современный способ
element.remove();
// Удалить все дочерние элементы
const container = document.getElementById('container');
while (container.firstChild) {
container.removeChild(container.firstChild);
}
// Или проще:
container.innerHTML = '';5. Навигация по DOM
const element = document.querySelector('.item');
// Получить родителя
const parent = element.parentNode;
// Получить всех детей
const children = element.childNodes; // Все узлы, включая текстовые
const childrenElements = element.children; // Только элементы
// Получить первого и последнего ребенка
const firstChild = element.firstChild;
const firstElementChild = element.firstElementChild;
const lastChild = element.lastChild;
const lastElementChild = element.lastElementChild;
// Получить соседние элементы
const nextSibling = element.nextSibling;
const nextElementSibling = element.nextElementSibling;
const previousSibling = element.previousSibling;
const previousElementSibling = element.previousElementSibling;6. Работа со стилями
const element = document.getElementById('myElement');
// Изменить стиль напрямую
element.style.color = 'red';
element.style.backgroundColor = '#f0f0f0';
element.style.fontSize = '20px';
element.style.display = 'none'; // Скрыть элемент
element.style.display = 'block'; // Показать элемент
// Получить вычисленные стили
const computedStyle = window.getComputedStyle(element);
const color = computedStyle.color;
const width = computedStyle.width;
// Изменить несколько стилей одновременно
Object.assign(element.style, {
color: 'blue',
fontSize: '18px',
margin: '10px'
});