Нужны ли атрибуты данных html5?
Мне интересно, действительно ли атрибуты данных html нужны значение, которое нужно применить?
Интересно, потому что часто все, что мы хотим знать, - это то, что атрибут фактически установлен как флаг. (конечно, мы могли бы использовать класс для этого, но реалистично, если вы не собираетесь стилизовать эти элементы по-другому, тогда флаги - больше данных, чем семантический элемент).
Прекрасным примером этого является то, что если мы хотим, чтобы ссылка прокручивала к ней цель вместо того, чтобы прыгать, наш код jQuery может выглядеть так:
$(document).on('click', '[data-scroll-link'], function(){/**do scroll**/});
Я знаю, что в google chrome достаточно, чтобы якорь отображался как
<a href="#bottom" data-scroll-link>Scroll to bottom</a>
Но это будет работать везде? и это даже допустимый HTML5 (я считаю, что это связано с автофокусом, атрибутами autoplay etc). или нам нужно:
<a href="#bottom" data-scroll-link="true">Scroll to bottom</a>
Ответы
Ответ 1
Нет. Но...
Как обычно со всеми атрибутами, в сериализации application/xhtml+xml
применяются правила XML, и атрибут должен иметь явное имя и (указанное) значение.
Итак, этот вопрос действительно связан с сериализацией text/html
, поэтому соответствующая часть спецификации HTML5 Раздел 8 Синтаксис HTML
В частности, в attributes говорится:
Атрибуты могут быть указаны четырьмя различными способами:
где первый из них:
Синтаксис пустой атрибуты
Просто имя атрибута. Значение неявно является пустой строкой.
Необходимо понять, что значение имеет тип string, а не типа boolean.
Например, при <input id="cb" type="checkbox" checked>
атрибут "checked" отражается как свойство true, так и false. Так
if (document.getElementById("cb").checked)
будет оценивать значение true для указанной выше разметки.
В отличие от <input id="cb" type="checkbox" data-checked>
, атрибут "проверенный данными" отражается через объект набора данных в виде строки. Значение этого свойства - это пустая строка, которая в JavaScript ложна. Таким образом,
if (document.getElementById("cb").dataset.checked)
будет оценивать значение false для указанной выше разметки.
Чтобы выполнить эквивалентный тест, сравните значение для "not undefined". То есть.
if (document.getElementById("cb").dataset.checked !== undefined)
будет оценивать значение true для указанной выше разметки.
См. http://jsfiddle.net/GAxvW/
Ответ 2
Простой булевой тест для атрибутов элемента
Чтобы расширить превосходный ответ Alohci, следующий простой и гибкий способ проверить значение атрибута true
boolean, предоставленное с использованием одного из трех стандартных соглашений HTML: <foo data-bar/>
, <foo data-bar="true"/>
или <foo data-bar="data-bar"/>
.
var a = elem['data-bar'];
var aTrue = ( a != null && a !== false && a !== 0 && a.charAt(0) != 'f' &&
a.charAt(0) != 'n' );
С приведенным выше кодом значение false
, если undefined
, или установлено на один из: f*, n*, 0
(без учета регистра) и true
, если определено и установлено в один из: (empty string), (attribute name), (anything else)
.
Пустые строки оцениваются в true
здесь, потому что атрибуты HTML без значений ''
, которые равны false
в JS (и что-то вроде <foo disabled/>
должно быть равно <foo disabled="true"/>
). Вы можете использовать приведенный выше код для более общего тестирования строк, удалив != null && a !== false
.