Атрибуты HTML и свойства элементов DOM

Элементы веб-страницы могут содержать в себе атрибуты — сущности, которые добавляют элементу определенную информацию о нем. Благодаря атрибутам, элемент страницы можно привести в конкретное состояние (поставить «галочку» в чекбоксе), сохранить текстовые данные (data-атрибуты), произвести стилизацию с помощью CSS, а также предоставить JavaScript удобный способ воздействовать на элемент. В этой статье мы разберем правила преобразования атрибутов HTML в DOM-свойства при чтении браузером веб-страницы, выявим разницу между атрибутами и свойствами, узнаем, как управлять атрибутами с помощью свойств JavaScript, а также используя getAttribute, setAttribute и другие методы.

Сравнение свойств объекта DOM и атрибутов HTML

Во время загрузки страницы браузер проводит разбор HTML-кода и составляет из его элементов дерево объектов DOM. В процессе такого преобразования атрибуты становятся свойствами DOM-объектов. Имена свойств устанавливаются по следующим правилам:

  • если атрибут является стандартным для определенного элемента по спецификации, то объект DOM для этого элемента будет содержать свойство, одноименное этому атрибуту;
  • если атрибут нестандартный (его нет в спецификации для конкретного элемента), то соответствующее ему свойство в объекте создаваться не будет;
  • значение большинства свойств будет идентично строке, которая является значением соответствующего атрибута;
  • атрибут style будет преобразован в свойство style, значением которого будет объект CSSStyleDeclaration;
  • по причине того, что слово class зарезервировано в JavaScript, атрибут class, содержащий имя класса элемента, в объекте будет представлен под другим именем — className;
  • некоторые атрибуты, которые записываются в теге без значения (то есть имеют пустую строку в качестве значения), в свойстве будут содержать булевый тип (например, теги полей формы checked, selected, disabled в свойстве объекта DOM будут иметь значение либо true, либо false).

HTML:

<input type="checkbox" class="someCheckbox" style="opacity: 0.6;" number='3' disabled>

JavaScript:

// Объект DOM
const someCheckbox = document.querySelector('.someCheckbox');

// Атрибут type является стандартным для input
// Значение свойства равно значению атрибута
const someCheckboxType = someCheckbox.type; // 'checkbox'

// Атрибут number нестандартный для input
const someCheckboxNumber = someCheckbox.number; // undefined

// Значение атрибута style — объект CSSStyleDeclaration
const someCheckboxStyle = someCheckbox.style; // CSSStyleDeclaration

// Значение класса извлекается через свойство className
const someCheckboxClass = someCheckbox.className; // 'someCheckbox'

// Атрибут disabled имеет булевое значение true
const someCheckboxDisabled = someCheckbox.disabled; // true

Свойства объекта DOM и атрибуты HTML имеют много похожего, но также имеют отличия по двум критериям: тип данных и регистрозависимость. Отобразим эти различия в таблице:

АтрибутСвойство
Тип данныхСтрокаНестандартные — любой, для стандартных атрибутов тип описан в спецификации
РегистрозависимостьНетДа

Управление атрибутами тегов через JavaScript

После создания DOM-объекта становится возможным управление им из JavaScript. Объект DOM ведет себя, как обычный JavaScript-объект. Манипулируя его свойствами, мы можем влиять на HTML-атрибуты элемента веб-страницы.

В зависимости от типа атрибута, способы взаимодействия с ним через JS могут отличаться. Например, так как для нестандартных атрибутов не создаются свойства в объекте DOM, мы не можем работать со значением этих атрибутов через свойства. Рассмотрим подробнее способы работы со значениями атрибутов:

  • через свойства объектов DOM;
  • с помощью методов getAttribute, setAttribute, removeAttribute и hasAttribute
  • используя свойство attributes.

Управление через свойства объектов DOM

Взаимодействие с атрибутами через DOM-свойства характерно для стандартных атрибутов, то есть тех атрибутов, которые закреплены за своими тегами по спецификации. Обращаясь к свойствам объекта, мы получаем доступ к значению атрибута.

Чтобы получить нужное значение атрибута, нужно просто обратиться к соответствующему свойству. Для записи нового значения — вызываем свойства и через знак «равно» устанавливаем новое.

<div class="message"></div>
// Извлечем элемент с классом message
const element = document.querySelector('.message');

// Получим его класс с помощью соответствующего свойства
const elementClass = element.className; // 'message'

// Запишем новое значение, которое будет содержать дополнительный класс
element.className = 'message message-critical';

// Удалим все классы, присвоив пустую строку
element.className = '';

Управление с помощью методов getAttribute, setAttribute, removeAttribute и hasAttribute

Нестандартные атрибуты недоступны через свойства. В этом случае на помощь приходят специальные методы объекта DOM:

  • getAttribute — извлечь значение;
  • setAttribute — установить значение;
  • hasAttribute — проверить наличие атрибута;
  • removeAttribute — удалить атрибут.

Примеры использования методов:

const pairFirst = document.querySelector('#pairFirst');
const pairSecond = document.querySelector('#pairSecond');

// Если у элемента pairSecond есть атрибут handled
// для элемента pairFirst установим атрибут status со значением active
if (pairSecond.hasAttribute('handled')) {
	pairFirst.setAttribute('status', 'active');
}

// Скопируем значение атрибута status из pairFirst в pairSecond
const pairFirstStatus = pairFirst.getAttribute('status');
pairSecond.setAttribute('status', pairFirstStatus);

// Удалим у pairFirst атрибут handled
pairFirst.removeAttribute('handled');

Управление с использованием свойства attributes

Свойство attributes получает коллекцию атрибутов определенного элемента. Так как это коллекция, то ее можно перебрать в цикле JavaScript. Каждый объект коллекции содержит свойства name и value, в которых находятся, соответственно, имя и значение атрибутов.

HTML:

<div id="extra" class="common" series="16"></div>

JavaScript:

const extra = document.querySelector('#extra');

// Переберем все атрибуты элемента с идентификатором extra
// и получим их названия и значения
for (let attribute of extra.attributes) {
    const attributeName =  attribute.name; // id, class, series
    const attributeValue =  attribute.value; // 'extra', 'common', '16'
}

Data-атрибуты и свойство dataset

В HTML существует возможность создавать собственные атрибуты, помимо стандартных. Чтобы быть уверенным в том, что имени создаваемого пользовательского атрибута нет в списке стандартных, при установлении нового атрибута ему добавляется префикс data-. В итоге мы получаем data-атрибут, доступ к которому можно получить через свойство dataset элемента DOM.

Такие атрибуты могут использоваться для хранения и получения каких-либо пользовательской информации. Например, с помощью datа-атрибутов можно создать индикатор выполнения. Ширина элемента, отвечающего за процент заполнения индикатора, будет зависеть от числа, находящего в data-атрибуте этого элемента — data-percentage. Такая зависимость устанавливается в CSS с помощью свойства width с относительной шириной в процентах от ширины всего индикатора. Периодически увеличивая значение атрибута data-percentage через JavaScript, мы создаем эффект заполнения. Периодичность устанавливается методом setInterval.

<!-- Изначально процент заполнения равен нулю -->
<div class="progressBar" id="progressBar">
    <div data-percentage="0"></div>
</div> 
/* Стили самого индикатора */
.progressBar {
    width: 500px;
    height: 20px;
    background: #fff;
    border: 2px solid darkblue;
    border-radius: 10px;
    overflow: hidden;
}

/* Стили элемента заполнения */
.progressBar [data-percentage] {
    height: 100%;
    background: blue;
}
// Получим элемент заполнения
const percentageElem = document.querySelector('#progressBar [data-percentage]');

// Извлечем текущее значение атрибута
const percentageNumCurrent = percentageElem.dataset.percentage;

// Увеличим его
const percentageNumNew = +percentageNumCurrent + 10;

// Обновим значение атрибута в теге
percentageElem.dataset.percentage = percentageNumNew;

// Добавим к полученному числу знак процента
// и обновим ширину элемента заполнения
percentageElem.style.width = percentageNumNew + '%';

// Используя вышеуказанный JS-код с методом setInterval, мы получим работающий индикатор выполнения

Вместо свойства dataset, также возможно использовать getAttribute и setAttribute:

// Вместо percentageElem.dataset.percentage = percentageNumNew;
percentageElem.setAttribute('data-percentage', percentageNumNew);

Названия data-атрибутов, состоящие из нескольких слов, которые в теге записаны через дефис, в свойстве dataset преобразуются в «верблюжью» нотацию. Атрибут data-user-address будет иметь свойство userAddress, то есть получить доступ к этому свойству можно будет так: dataset.userAddress.

Оцените статью
DevReflex
Добавить комментарий