Подтвердить что ты не робот

Нужны ли атрибуты данных 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>
4b9b3361

Ответ 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.