0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Самая большая часть DOM API сосредоточена в свойствах конкретных элементов. В этом уроке мы рассмотрим только самые базовые свойства, чтобы показать, как они работают в принципе.</p>
1
<p>Самая большая часть DOM API сосредоточена в свойствах конкретных элементов. В этом уроке мы рассмотрим только самые базовые свойства, чтобы показать, как они работают в принципе.</p>
2
<p>В повседневной практике программисты постоянно обращаются к<a>документации</a>, чтобы узнать, какие есть свойства и методы у узлов для управления ими.</p>
2
<p>В повседневной практике программисты постоянно обращаются к<a>документации</a>, чтобы узнать, какие есть свойства и методы у узлов для управления ими.</p>
3
<p>Так выглядит HTML атрибут="значение":</p>
3
<p>Так выглядит HTML атрибут="значение":</p>
4
<p>Так выглядит DOM свойство:значение:</p>
4
<p>Так выглядит DOM свойство:значение:</p>
5
<h2>Атрибуты</h2>
5
<h2>Атрибуты</h2>
6
<p>У каждого тега в HTML есть атрибуты. Некоторые из них общие для всех, другие - специфичные для конкретных тегов:</p>
6
<p>У каждого тега в HTML есть атрибуты. Некоторые из них общие для всех, другие - специфичные для конкретных тегов:</p>
7
<p>В примере выше атрибуты id и class можно использовать с любым тегом. Атрибут href только с некоторыми - например, с тегом <a>.</p>
7
<p>В примере выше атрибуты id и class можно использовать с любым тегом. Атрибут href только с некоторыми - например, с тегом <a>.</p>
8
<p>Когда браузер загрузил HTML, на его основе строится DOM. Во время обработки, каждый тег становится узлом, а атрибуты - свойствами этого узла. Обычно имена атрибутов и свойств узлов совпадают между собой:</p>
8
<p>Когда браузер загрузил HTML, на его основе строится DOM. Во время обработки, каждый тег становится узлом, а атрибуты - свойствами этого узла. Обычно имена атрибутов и свойств узлов совпадают между собой:</p>
9
<p>Существуют некоторые исключения. Например, атрибут class соответствует свойству className. Есть несколько дополнительных способов для удобной работы с классами.</p>
9
<p>Существуют некоторые исключения. Например, атрибут class соответствует свойству className. Есть несколько дополнительных способов для удобной работы с классами.</p>
10
<p>Классов может быть абсолютно любое количество. Они задаются обычной текстовой строкой. Соответственно, если нам нужно изменить этот список, придется работать со строками, что невероятно неудобно.</p>
10
<p>Классов может быть абсолютно любое количество. Они задаются обычной текстовой строкой. Соответственно, если нам нужно изменить этот список, придется работать со строками, что невероятно неудобно.</p>
11
<p>А вот как это можно сделать с помощью DOM-дерева:</p>
11
<p>А вот как это можно сделать с помощью DOM-дерева:</p>
12
<p>Есть и дополнительные методы:</p>
12
<p>Есть и дополнительные методы:</p>
13
<ul><li>Метод el.classList.contains("class") проверяет, содержит ли элемент нужный класс, а затем возвращает true или false</li>
13
<ul><li>Метод el.classList.contains("class") проверяет, содержит ли элемент нужный класс, а затем возвращает true или false</li>
14
<li>Метод el.classList.toggle("class") проверяет наличие класса. Если класс есть - удаляет его, если нет - добавляет</li>
14
<li>Метод el.classList.toggle("class") проверяет наличие класса. Если класс есть - удаляет его, если нет - добавляет</li>
15
</ul><p>Именование - это не единственное различие между атрибутами и свойствами. Отличий значительно больше и они не всегда очевидны. Вот лишь некоторые из них:</p>
15
</ul><p>Именование - это не единственное различие между атрибутами и свойствами. Отличий значительно больше и они не всегда очевидны. Вот лишь некоторые из них:</p>
16
<ol><li><p>Атрибут - всегда строка, а свойство - не всегда. Например:</p>
16
<ol><li><p>Атрибут - всегда строка, а свойство - не всегда. Например:</p>
17
<p>Значение свойства rows соответствующего элемента в DOM-дереве будет числом.</p>
17
<p>Значение свойства rows соответствующего элемента в DOM-дереве будет числом.</p>
18
</li>
18
</li>
19
<li><p>Атрибуты не чувствительны к регистру:</p>
19
<li><p>Атрибуты не чувствительны к регистру:</p>
20
<p>Так писать не стоит, но просто знать об этом факте уже полезно.</p>
20
<p>Так писать не стоит, но просто знать об этом факте уже полезно.</p>
21
</li>
21
</li>
22
<li><p>Атрибут всегда присутствует в HTML, а значит доступен через innerHTML. А вот многие свойства не имеют соответствующих атрибутов. Например, у тега <a> есть свойство hash, но нет такого атрибута.</p>
22
<li><p>Атрибут всегда присутствует в HTML, а значит доступен через innerHTML. А вот многие свойства не имеют соответствующих атрибутов. Например, у тега <a> есть свойство hash, но нет такого атрибута.</p>
23
</li>
23
</li>
24
</ol><p>Как мы увидели выше, атрибут и свойство - это не одно и то же. Поэтому существует набор методов для управления атрибутами:</p>
24
</ol><p>Как мы увидели выше, атрибут и свойство - это не одно и то же. Поэтому существует набор методов для управления атрибутами:</p>
25
<ul><li>el.hasAttribute(name) - проверяет наличие атрибута</li>
25
<ul><li>el.hasAttribute(name) - проверяет наличие атрибута</li>
26
<li>el.getAttribute(name) - получает значение атрибута</li>
26
<li>el.getAttribute(name) - получает значение атрибута</li>
27
<li>el.setAttribute(name, value) - устанавливает атрибут</li>
27
<li>el.setAttribute(name, value) - устанавливает атрибут</li>
28
<li>el.removeAttribute(name) - удаляет атрибут</li>
28
<li>el.removeAttribute(name) - удаляет атрибут</li>
29
<li>el.attributes - выдает список HTML-атрибутов</li>
29
<li>el.attributes - выдает список HTML-атрибутов</li>
30
</ul><p>Обратите внимание, что они работают именно с атрибутами и их именами, а не свойствами. И позволяют не только их извлекать, но и менять. Возникает закономерный вопрос: поменяется ли атрибут, если поменять свойство и наоборот?</p>
30
</ul><p>Обратите внимание, что они работают именно с атрибутами и их именами, а не свойствами. И позволяют не только их извлекать, но и менять. Возникает закономерный вопрос: поменяется ли атрибут, если поменять свойство и наоборот?</p>
31
<p>Обычно синхронизация работает так: при изменении атрибута свойство обновляется автоматически.</p>
31
<p>Обычно синхронизация работает так: при изменении атрибута свойство обновляется автоматически.</p>
32
<p>Но существуют и исключения. Из этих тезисов не следует делать вывод, что нужно стараться работать через атрибуты. Наоборот, старайтесь работать со свойствами DOM-дерева. Атрибуты используйте только для чтения, чтобы получить то состояние, которое было в DOM на момент инициализации - парсинга HTML:</p>
32
<p>Но существуют и исключения. Из этих тезисов не следует делать вывод, что нужно стараться работать через атрибуты. Наоборот, старайтесь работать со свойствами DOM-дерева. Атрибуты используйте только для чтения, чтобы получить то состояние, которое было в DOM на момент инициализации - парсинга HTML:</p>
33
<p>В отличие от свойств, значение атрибута всегда совпадает с тем, что мы видим в HTML. А вот свойства иногда приводятся в нормализованный вид:</p>
33
<p>В отличие от свойств, значение атрибута всегда совпадает с тем, что мы видим в HTML. А вот свойства иногда приводятся в нормализованный вид:</p>
34
<p>Нестандартные атрибуты никогда не превращаются в свойства соответствующих элементов DOM-дерева. Например, если мы добавим атрибут href в тег p, то он будет проигнорирован. При этом мы все еще сможем извлечь его через getAttribute.</p>
34
<p>Нестандартные атрибуты никогда не превращаются в свойства соответствующих элементов DOM-дерева. Например, если мы добавим атрибут href в тег p, то он будет проигнорирован. При этом мы все еще сможем извлечь его через getAttribute.</p>
35
<p>Для работы с произвольными свойствами в HTML зарезервирован специальный атрибут data-*. На месте звездочки может стоять любое слово:</p>
35
<p>Для работы с произвольными свойствами в HTML зарезервирован специальный атрибут data-*. На месте звездочки может стоять любое слово:</p>
36
<p>Такие атрибуты активно используются в JavaScript- плагинах и позволяют не завязываться на классы. В элементах DOM они доступны через специальное свойство dataset:</p>
36
<p>Такие атрибуты активно используются в JavaScript- плагинах и позволяют не завязываться на классы. В элементах DOM они доступны через специальное свойство dataset:</p>
37
<p>Внутри объекта dataset имя каждого свойства - это строка после data- в атрибуте. Если имя содержит дефис, то он удаляется, а следующая за ним буква становится заглавной:</p>
37
<p>Внутри объекта dataset имя каждого свойства - это строка после data- в атрибуте. Если имя содержит дефис, то он удаляется, а следующая за ним буква становится заглавной:</p>
38
<h2>Свойства</h2>
38
<h2>Свойства</h2>
39
<p>В зависимости от типа элемента, меняется и набор свойств, кроме тех, что достались в наследство от Node и Element.</p>
39
<p>В зависимости от типа элемента, меняется и набор свойств, кроме тех, что достались в наследство от Node и Element.</p>
40
<p>Чтобы узнать список этих свойств, можно обращаться к спецификации. Они описаны в специальном формате, который несложно понять:</p>
40
<p>Чтобы узнать список этих свойств, можно обращаться к спецификации. Они описаны в специальном формате, который несложно понять:</p>
41
<p>Как и в случае с навигацией по DOM-дереву, не нужно запоминать все особенности поведения атрибутов и свойств. Как правило, понимание приходит на практике во время экспериментов методом проб и ошибок.</p>
41
<p>Как и в случае с навигацией по DOM-дереву, не нужно запоминать все особенности поведения атрибутов и свойств. Как правило, понимание приходит на практике во время экспериментов методом проб и ошибок.</p>