Использование data-* attributes
HTML5 добавил возможность хранить данные напрямую в html коде. При этом эти данные не будут видны пользователю. Data-* attributes позволяет нам хранить дополнительные данные в любых html элементах, не засоряя имена классов.
HTML ситаксис
Синтаксис очень простой. Например, у вас есть статья и вы хотите хранить некоторую дополнительную информацию, которая не должна быть показана. Используя data-* attributes можно сделать так:
<article
id="electriccars"
data-columns="3"
data-indexnumber="12314"
data-parent="cars">
...
</article>
Из примера видно, что все data-* attributes записываются следующим образом:
«data-» + «name-parameter»
Доступ из JavaScript
Чтение данных из data-* attributes так же очень простое. Мы можем использовать getAttribute() для чтения, но по стандарту определен более простой способ, а именно через свойство dataset:
var article = document.querySelector('#electriccars');
var data = article.dataset;
// data.columns -> "3"
// data.indexnumber -> "12314"
// data.parent -> "cars"
Значением каждого свойства является строка, мы можем получать и изменять данное значение. Если мы напишем article.dataset.columns = 5, то свойство data-columns изменится на 5.
CSS доступ
К data-* attributes мы можем так же просто получить доступ и через CSS. Например, чтобы получить data-parent атрибут статьи, вы можете использовать псевдоэлементы в CSS с attr():
article::before {
content: attr(data-parent);
}
Вы так же можете использовать селекторы в CSS, чтобы изменить стили в зависимости от значения data-*:
article[data-columns='3']{
width: 400px;
}
article[data-columns='4']{
width: 600px;
}
Посмотреть, как все это работать можно по ссылке.
Data attributes так может содержать изменяющуюся информацию, например, очки в игре. Используя CSS селекторы и доступ из JavaScript мы можем создавать классные эффекты без написания дополнительного кода для отображения. Смотрим видео. Ссылка на код.
Проблемы
Не храните данные в data-* attributes, которые должны быть показаны, так как вспомогательные технологии не могут получить к ним доступ. К тому же поисковые роботы не индексируют data-* attributes.
Печально, но IE не поддерживает dataset. Для чтения атрибутов необходимо использовать getAttribute(), для изменения значения setAttribute().
Скорость чтения data-attributes намного ниже по сравнению с хранением этих данных в JS. Использование dataset работает даже медленнее, чем getAttribute().
Спасибо за внимание!
Подписывайтесь на рассылку 😉