Пользовательские атрибуты в HTML
Евгений, 12 апреля 2009
Иногда возникает необходимость связать с HTML элементом дополнительные данные, с которыми потом будет работать JavaScript. Простое и очевидное решение — добавить новый атрибут, но с ним не согласен валидатор. Как тут быть?
Решение очевидно, отправить старичка на пенсию и посмотреть в будущее. В HTML5 мы можем объявить любой атрибут с тем лишь условием, что его имя должно начинаться на data-:
<div data-example="Пример атрибута" data-targets=".content count"></div>
Раздел спецификации: Embedding custom non-visible data
Чтобы пройти проверку валидатором нужно использовать доктайп HTML5:
<!DOCTYPE html>
Но он же еще только в черновике? CSS3 тоже в черновике, но никому это не мешает использовать готовые элементы. Как некоторые любят говорить «Хватит тормозить развитие веб». Для валидных HTML 4.01 документов переход на HTML5 в большинстве случаев сводится к смене доктайпа. С XHTML несколько сложнее, нужно использовать Content-Type: application/xhtml+xml (отдавать XHTML5 с Content-Type: text/html для обработки HTML парсером нельзя), что приводит к столкновению с реальным миром, многие браузеры его не поддерживают, а некоторые, даже не собираются, хорошее решение этой проблемы не использовать XHTML.
Самое замечательное в этом нововведении то, что это не нововведение, а обычный атрибут, в HTML5 он просто стандартизируется.
<p id="attribute-test" data-example="Пример атрибута"></p>
<script type="text/javascript">
// прямой доступ к атрибуту с данными
// работает во всех браузерах
var attributeTest = document.getElementById('attribute-test');
attributeTest.innerHTML = attributeTest.getAttribute('data-example');
</script>
Для упрощения доступа к таким данным в HTML5 вводится DOM атрибут dataset, но браузерами он пока не поддерживается:
<p id="dataset-test" data-test="Поддерживается атрибут dataset">
Атрибут dataset не поддерживается
</p>
<script type="text/javascript">
// удобный доступ к данным через dataset
// браузерами пока не поддерживается
var datasetTest = document.getElementById('dataset-test');
if(datasetTest.dataset) {
datasetTest.innerHTML = datasetTest.dataset.test;
}
</script>
Ответ на статью: Интересная задачка для знатоков.

XHTML5 — это вы как-то поторопились ) Им бы со 2-й версией справиться.
Забавно, что сам как раз сейчас штудирую черновик HTML 5, чтобы внедрить это дело в Zen Coding и тоже очень порадовался подобной системе атрибутов.
XHTML5 — это XML версия HTML5, а XHTML2 это совершенно другой стандарт.
http://www.w3.org/TR/html5/introduction.html#html-vs-xhtml
Есть у меня ощущение, что они сильно намудрили. Допускать параллельное существование названий XHTML 2 и XHTML 5, с виду отличающихся только версией, а по сути разных вещей — это очень зря.
Думаю, что я не первый и не последний из запутавшихся.
Не то, чтобы намудрили, так получилось.
Там вроде бы так было:
W3C разрабатывало XHTML 2 и вообще двигались в направлении XHTML, это не одобрили разработчики браузеров (Opera, Mozilla, Apple, MS) объединились в WHATWG и начали разрабатывать HTML 5 (как продолжение HTML 4), со времен W3C пришлось принять их предложения, и на HTML 5 появился значок W3C. Ну и так уж вышло, что у HTML 5 есть XML версия, которую называют XHTML 5.
Путаница с XHTML 2 и XHTML 5 возникает постоянно.
А можно не мудрствовать лукаво и использовать имеющиеся атрибуты вроде
titleилиrel, или совмещать суть и поведение элемента в егоclassНестандартное использование существующих атрибутов гораздо хуже, чем использование невалидных атрибутов, не говоря уже об использовании стандартного способа для создания пользовательских атрибутов.
На нестандартный атрибут только валидатор ругнется и если разработчик знает, что делает это не проблема. А вот при нестандартных значениях существующих атрибутов предсказать как это повлияет на работу со страницей множества различных приложений невозможно. Важно и то, что это не лучшим образом скажется на очевидности кода, например:
Что мудрого в том, чтобы добавить data- перед именем атрибута.
Гораздо проще хранить данные с помошью JS (учитывая что изымаются эти данные в том жа контексте)
window.userDataset = [];
...
window.userDataset['attribute-test']['data-example'] = 'Пример атрибута';
как-то так, конкретная реализация зависит от конкретной ситуации. Если хочется библиотеки, сделать её не трудно.
Так же можно подумать о namespace, но этот путь сложнее и запутаннее вышеописанного.
"..Решение очевидно, отправить старичка на пенсию и посмотреть в будущее. ."
рановато все таки.
Спасибо за интересную статью, вот буквально на дня агитировал коллег к применению «псевдоатрибутов», как удобную замену какому нить: class="user_id_1234", про префикс data- не знал, буду использовать ;)
Вам поможет http://docs.jquery.com/Data для хранения данных в каких либо HTML элементах.
Как и решение предложенное выше Сергеем, это неудобно если данные нужно прикрепить при генерации HTML. Можно, конечно, отдельный элемент script вставлять с данными, но удобно ли это, очевидно, что нет, поэтому и вводят data-* атрибуты.
Скорей бы, XHTML 5!
С XHTML5 все не так просто, там придется работать с реальными xml и нет поддержки в IE, а вот HTML5 можно использовать уже сейчас, например, Google делает на основе HTML5 новую версию GMail для мобильных устройств.
Евгений, а разве не проще создать namespace и атрибуты прописывать через него?
Например:
<html xmlns:data="http://myurl.ru" >
…
<div data:example="Пример атрибута" data:targets=".content count">
…
</div>
Разве не будет проходить валидацию?
И с xhtml дружен.
Валидацию проходить не будет.
Не могу даже предположить, чем это проще data-* атрибутов.
Какую валидацию? W3C? Она устарела и нуждается в апдейте поскольку не учитывает неймспейсы как таковые, а это неправильно. Поэтому я его использую только в образовательных целях. Если уж так нужна валидация, напишите свой DTD.
Как кому проще, каждый решает за себя. По мне, атрибут «data-» лишний мусор ни с чем не связанный и ни из чего высосанный.
Минусы:
1. Вы привязаны к названию атрибута, который должен начинаться с «data-». С неймспейсами гибше. Префикс может быть любой.
2. В JS. Минус будет сбивать с толку, и может скрывать синтаксическую ошибку, при этом выдавая логическую ошибку. А неправильное использование двоеточия приведёт к синтаксической ошибке, которую вы сразу увидите.
3. Привычка работать с xml-подобным синтаксисом очень полезна поскольку всё строится и будет строиться на нём.
Поддерживаю, устарела вместе со старыми стандартами, поэтому я ориентируюсь на HTML5.
В HTML5 нет DTD, зато есть data-* атрибуты.
custom data атрибуты нужны достаточно часто, поэтому для них сделали встроенное в HTML, простое решение, без неймспейсов, DTD и т.п.
Вот если понадобиться другой префикс, можно и неймспейс использовать, но не думаю, что такое часто случается.
Для доступа к значениям без использования минуса в спецификации есть атрибут dataset, просто он пока нигде не реализован.
А запутаться в коде так, чтобы этот минус вылез в код еще нужно умудриться, даже если вылезет там тоже в большинстве случаев будет ошибка, хотя саму возможность не отрицаю.
Синтаксис тут в обоих случаях xml-подобный.
data-* атрибуты обычные XML атрибуты, единственное дополнение это dataset.
HTML5 почему-то не на нем строится, как на нем вообще можно построить разметку максимально устойчивую к ошибкам (но XML версия там тоже есть).
А что такой шум в блогах насчет html5? Объявили дату выхода официальной спецификации что ли или уже есть поддержка в каком нибудь браузере?