Кратко
СкопированоЭлемент — это кусочек HTML в DOM-дереве. Браузер создаёт DOM для взаимодействия между JavaScript и HTML. Каждый HTML-тег при этом превращается в элемент DOM. Ещё такие элементы называют узлами.
Из DOM можно получить элемент и изменить его. Браузер заметит изменения и отобразит их на странице.
Как пишется
СкопированоНапример, можно поменять выравнивание у элемента h1:
// Получаем элемент из DOMconst element = document.getElementsByTagName('h1')[0]// После выполнения этого кода h1 выравнивает текст по центруelement.align = 'center'// Меняем цвет шрифта на красныйelement.style.color = 'red'
// Получаем элемент из DOM
const element = document.getElementsByTagName('h1')[0]
// После выполнения этого кода h1 выравнивает текст по центру
element.align = 'center'
// Меняем цвет шрифта на красный
element.style.color = 'red'
Как понять
СкопированоHTML-элементы содержат свойства, которые можно разделить на группы:
- свойства, связанные с HTML-атрибутами: ID, классы, стили и так далее;
- свойства и методы связанные с обходом DOM: получение дочерних элементов, родителя, соседей;
- информация о содержимом;
- обработка событий;
- специфические свойства элемента.
Первые три группы свойств есть у всех элементов. Специфические свойства отличаются в зависимости от типа элемента. Например, у полей ввода есть свойства, которых нет у параграфов и блоков: value, type и другие.
Свойства, связанные с HTML-атрибутами
СкопированоЧитать и записывать значения HTML-атрибутов можно при помощи свойств элемента. Название обычно совпадает с названием атрибута.
id — получить идентификатор элемента.
class — список классов в HTML-атрибуте class.
const element = document.getElementsByTagName('div')[0]// Напечатать список классов в консольconsole.log(element.className)// Установить свой классelement.className = 'hacked'
const element = document.getElementsByTagName('div')[0]
// Напечатать список классов в консоль
console.log(element.className)
// Установить свой класс
element.className = 'hacked'
style — добавить стили. Стили добавляются так же с помощью свойств. Свойства именуются по аналогии с CSS-свойствами:
const element = document.getElementsByTagName('div')[0]// CSS-свойство background-colorelement.style.backgroundColor = 'beige'// CSS-свойство colorelement.style.color = 'gray'// CSS-свойство margin-topelement.style.marginTop = '20px'
const element = document.getElementsByTagName('div')[0]
// CSS-свойство background-color
element.style.backgroundColor = 'beige'
// CSS-свойство color
element.style.color = 'gray'
// CSS-свойство margin-top
element.style.marginTop = '20px'
Свойства и методы, связанные с DOM
Скопированоchildren— список дочерних элементов;parent— получить родительский элемент;Element nextиElement Sibling previous— получить следующий или предыдущий узел-сосед.Element Sibling
get— поиск среди дочерних элементов по названию класса;Elements By Class Name ( ) get— поиск среди дочерних элементов по названию тега;Elements By Tag Name ( ) query— поиск первого дочернего элемента, подходящего под CSS-селектор;Selector ( ) query— поиск всех дочерних элементов подходящих под CSS-селектор;Selector All ( )
С помощью этих свойств и методов можно перемещаться по дереву и даже обойти все его элементы, если это нужно.
Свойства с информацией о содержимом
Скопированоinner — это свойство возвращает HTML-код всего, что вложено в текущий элемент. При записи в это свойство, предыдущее содержимое будет затёрто. Страница отобразит новое содержимое:
const divElement = document.getElementsByTagName('div')[0]divElement.innerHTML = '<p>Добавлен из кода</p>'// После выполнения этого кода, на странице// отобразится параграф с указанным текстом
const divElement = document.getElementsByTagName('div')[0]
divElement.innerHTML = '<p>Добавлен из кода</p>'
// После выполнения этого кода, на странице
// отобразится параграф с указанным текстом
outer — это свойство возвращает HTML-код текущего элемента и всего, что в него вложено. При записи в это свойство, предыдущее содержимое будет затёрто.
text — свойство, возвращает текст всех вложенных узлов без HTML-тегов.
Почувствуй разницу на демо:
Свойства, связанные с событиями
СкопированоЭлемент может взаимодействовать с браузерными событиями. Для того, чтобы это происходило, нужно указать обработчик событий. Сделать это можно разными способами.
addEventListener
СкопированоСовременный способ обработки событий - это addEventListener.
element.addEventListener('click', (event) => { console.log('Клик по элементу')})
element.addEventListener('click', (event) => {
console.log('Клик по элементу')
})
Преимущества этого способа:
- поддержка добавления множества обработчиков одного и того же события на элементе (разные модули могут независимо обрабатывать событие);
- позволяет перехватывать события и в фазе всплытия, и в фазе погружения;
- есть опция однократного срабатывания, после которого обработчик сам удаляется;
- есть возможность начать выполнять действие по умолчанию не дожидаясь завершения обработчика;
- поддержка пользовательских событий (CustomEvent).
Недостатки этого способа:
- более многословный синтаксис;
- нельзя посмотреть какие обработчики уже висят на элементе.
Встроенные обработчики событий
СкопированоЭто свойства DOM-элементов, которые начинаются с приставки on (onclick, onchange, onsubmit и т. п.). В значении пишется JavaScript-код, который выполнится при наступлении события. Сейчас этот способ считается устаревшим, мы не рекомендуем его использовать.
element.onclick = (event) => { console.log('Клик по элементу')}
element.onclick = (event) => {
console.log('Клик по элементу')
}
Преимущества этого способа:
- один обработчик: последний присвоенный перезаписывает предыдущие;
- удобное удаление: достаточно присвоить null;
- поддержка в старых браузерах (Internet Explorer 8 и ниже).
Недостатки этого способа:
- нельзя использовать несколько обработчиков одного события на элементе;
- работает только на фазе всплытия, нельзя перехватить событие на фазе погружения;
- риск утечек памяти: не все браузеры удаляют обработчик при удалении элемента;
- если нужно однократное срабатывание события, обработчик нужно удалить вручную после срабатывания.
На практике
Скопированосоветует
Скопировано🛠 Если нужно добавить текст в элемент, то всегда используйте свойство text. Другие свойства обрабатывают HTML, это может привести к дырам в безопасности.
🛠 Для работы с классами элемента есть удобные методы, доступные через свойство class:
- добавить класс — метод
add.( ) - удалить класс — метод
remove.( )
const element = document.getElementsByTagName('div')[0]element.classList.add('hello')element.classList.remove('bye')
const element = document.getElementsByTagName('div')[0]
element.classList.add('hello')
element.classList.remove('bye')
🛠 В HTML часто используют data-атрибуты. Они используются, когда нужно передать данные через HTML. Например, когда сервер собирает стартовый HTML, он может поместить значения в data-атрибуты. Фронтендер затем может использовать их, вместо того, чтобы отправлять запрос на сервер. Название таких атрибутов начинаются с префикса data. Для доступа к ним из JavaScript используется свойство dataset:
const element = document.getElementsByTagName('div')[0]// Получить значение атрибута data-columns тега <div>console.log(element.dataset.columns)// Изменить значениеelement.dataset.columns = 99
const element = document.getElementsByTagName('div')[0]
// Получить значение атрибута data-columns тега <div>
console.log(element.dataset.columns)
// Изменить значение
element.dataset.columns = 99
🛠 У элементов очень много свойств. Если нужно что-то получить из элемента, то скорее всего уже есть свойство, которое хранит эти данные.
🛠 Если нужно удалить элемент и все вложенные в него, воспользуйтесь методом remove:
const element = document.querySelector('#some-element')element.remove()
const element = document.querySelector('#some-element')
element.remove()