HTML атрибуты и DOM свойства

При написании HTML-кода вы можете определить атрибуты HTML элементов. Как только браузер проанализирует ваш код, будет создан соответствующий узел DOM. Этот узел является объектом, и поэтому у него есть свойства.

Рассмотрим следующий HTML элемент.

<input id="name" type="text" value="Вася">

После того, как браузер проанализирует этот код, будет создан объект HTMLInputElement:

Созданный объект будет содержать десятки свойств, таких как: accept, accessKey, align, alt, assignedSlot, attributeStyleMap, attributes, autocapitalize, autocomplete, autofocus, baseURI, checked, childElementCount, childNodes, children, classList, className, clientHeight и другие.

Для данного объекта свойства - это свойства самого объекта, а атрибуты - это элементы свойства attributes этого объекта.

В данном конеретном случае значение attributes это объект типа NamedNodeMap

{
    0: type, 
    1: value, 
    length: 2
}

Когда для соответствующего HTML элемента будет создан DOM узел, большинству его атрибутов будут сопоставлены свойства с одинаковыми или похожими именами, но это отношение не один к одному. Например, для рассматриваемого input элемента соответствующий DOM узел среди прочих свойств будет иметь:

  • id
  • type
  • value

Свойство id является отраженным (reflected property) для атрибута id: геттер свойства считывает значение атрибута, а сеттер свойства записывает значение атрибута. id является полностью (pure) отраженным свойством.

Аналогично свойство type является отраженным свойством для атрибута type: геттер свойства считывает значение атрибута, а сеттер свойства записывает значение атрибута. Но type не является полностью отраженным свойством, поскольку он ограничен набором значений (text, number, checkbox, radio и другие).

Если задать <input type="foo">, то myInput.getAttribute('type') вернёт "foo", а myInput.type - значение по-умолчанию ("text").

В отличие от id и type, свойство value не отражает атрибут value. Вместо этого оно возвращает текущее значение input'а. Когда пользователь вручную изменяет значение поля ввода, свойство value будет отражать это изменение. Так что, если пользователь вводёт «Маша» в поле ввода, то myInput.value вернёт «Маша», в то время как myInput.getAttribute('value') - значение атрибута («Вася»).

Свойство value отражает текущее текстовое содержимое внутри поля ввода, тогда как атрибут value содержит начальное текстовое содержимое атрибута из исходного кода HTML.

Стоит отметить, что для атрибута value есть полностью отражённое свойство - defaultValue.

Вместо заключения

Значение HTML атрибута указывает начальное значение;
Значение DOM свойства является текущим значением;
Атрибуты инициализируют DOM свойства.


Похожие записи

+function ($) { "use strict"; }(window.jQuery);

  • объявляется IIFE (немедленно выполняемая функция-выражение)
  • в функцию передаётся объект библиотеки jQuery, которая внутри будет доступна через переменную с именем $
  • включается «строгий режим»

RxJs Subjects

Выдержки из доклада Андрея Алексеева (Tinkoff) про RxJs (Subject, Behaviour Subject, Replay Subject, Async Subject). Применение в Angular.

Не ставить фокус по клику

Проблема заключалась в следующем: когда имеется интерактивный элемент с :focus стилем и вы щелкаете по этому элементу, на нём остаётся focus стиль (outline обводка). У нативной кнопки всё работает as expected, но стоит её добавить любой стиль и, как побочный эффект, меняется её поведение.