В этом руководстве вы узнаете о взаимосвязи между атрибутами HTML и свойствами объекта DOM в JavaScript.
Когда веб-браузер загружает HTML-страницу, он создает соответствующие объекты DOM на основе узлов DOM документа.
Например, если страница содержит следующий элемент input :
<input type="text" id="username">
Веб-браузер создаст объект HTMLInputElement.
Элемент input имеет два атрибута:
- Атрибут
typeсо значениемtext. - Атрибут
idсо значениемusername.
Сгенерированный объект HTMLInputElement будет иметь соответствующие свойства:
input.typeсо значениемtext.input.idсо значениемusername.
Другими словами, веб-браузер автоматически преобразует атрибуты элементов HTML в свойства объектов DOM.
Однако веб-браузер только преобразует стандартные атрибуты в свойства объекта DOM. Стандартные атрибуты элемента перечислены в спецификации элемента.
Сопоставление атрибут-свойство не всегда однозначно. Например:
<input type="text" id="username" secured="true">
В этом примере secured — это нестандартный атрибут:
let input = document.querySelector('#username');
console.log(input.secured); // undefinedМетоды атрибутов
Для доступа как к стандартным, так и к нестандартным атрибутам используются следующие методы:
element.getAttribute(name)– получить значение атрибута.element.setAttribute(name, value)– установить значение для атрибута.element.hasAttribute(name)— проверить наличие атрибута.element.removeAttribute(name)– удалить атрибут.
element.attributes
Свойство element.attributes предоставляет динамическую коллекцию атрибутов, доступных для определенного элемента. Например:
let input = document.querySelector('#username');
for (let attr of input.attributes) {
console.log(`$ {
attr.name
} = $ {
attr.value
}`)
}Выход:
type = text id = username secure = true
Обратите внимание, что element.attributes — это NamedNodeMap, а не Array, поэтому у него нет методов Array.
Синхронизация атрибутов и свойств
При изменении стандартного атрибута соответствующее свойство автоматически обновляется с некоторыми исключениями, и наоборот.
Предположим, что у вас есть следующий элемент input :
<input type="text" id="username" tabindex="1">
В следующем примере показано, как изменение атрибута tabindex распространяется на свойство tabIndex и наоборот:
let input = document.querySelector('#username');
// attribute -> property
input.setAttribute('tabindex', 2);
console.log(input.tabIndex); // 2
// property -> attribute
input.tabIndex = 3;
console.log(input.getAttribute('tabIndex')); // 3В следующем примере показано, что изменение атрибута отражается в свойстве value, а не наоборот:
let input = document.querySelector('#username');
// attribute -> property: OK
input.setAttribute('value','guest');
console.log(input.value); // guest
// property -> attribute: doesn't change
input.value = 'admin';
console.log(input.getAttribute('value')); // guestСвойства DOM типизированы
Значение атрибута всегда является строкой. Однако, когда атрибут преобразуется в свойство объекта DOM, значение свойства может быть строкой, логическим значением, объектом и т. д.
Следующий элемент checkbox имеет атрибут checked и преобразуется его в свойство, это логическое значение:
<input type="checkbox" id="chkAccept" checked> Accept
let checkbox = document.querySelector('#chkAccept');
console.log(checkbox.checked); // trueНиже показан элемент input с атрибутом style :
<input type="password" id="password" style="color:red;with:100%">
Атрибут style — это строка, а свойство style — объект:
let input = document.querySelector('#password');
let styleAttr = input.getAttribute('style');
console.log(styleAttr);
console.dir(input.style);Выход:
[object CSSStyleDeclaration]
Атрибуты data-*
Если вы хотите добавить к элементу настраиваемый атрибут, вы должны добавить к нему префикс data- — например, data-secured, поскольку все атрибуты начинаются с data- — зарезервированы для использования разработчиком.
Чтобы получить доступ к атрибутам data-*, вы можете использовать свойство dataset. Например, у нас есть следующий элемент div с пользовательскими атрибутами:
<div id="main" data-progress="pending" data-value="10%"></div>
Ниже показано, как получить доступ к атрибутам data-* через свойство dataset :
let bar = document.querySelector('#main');
console.log(bar.dataset);Выход:
[object DOMStringMap] {
progress: "pending",
value: "10%"
}Заключение
- Атрибуты указываются в элементах HTML.
- Свойства — это указанные объекты DOM.
- Атрибуты преобразуются в свойства соответственно.
- Используйте свойство
element.attributesдля доступа к стандартным и пользовательским атрибутам элемента. - Используйте свойство
element.datasetдля доступа к атрибутамdata-*.
