HTML Diff
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 только с некоторыми - например, с тегом &lt;a&gt;.</p>
7 <p>В примере выше атрибуты id и class можно использовать с любым тегом. Атрибут href только с некоторыми - например, с тегом &lt;a&gt;.</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. А вот многие свойства не имеют соответствующих атрибутов. Например, у тега &lt;a&gt; есть свойство hash, но нет такого атрибута.</p>
22 <li><p>Атрибут всегда присутствует в HTML, а значит доступен через innerHTML. А вот многие свойства не имеют соответствующих атрибутов. Например, у тега &lt;a&gt; есть свойство 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>