Может ли элемент HTML иметь один и тот же атрибут дважды?
Я рассматриваю возможность написания кода, который создает HTML-тег, который может иметь повторяющиеся атрибуты, например:
<div data-foo="bar" class="some-class" data-foo="baz">
Является ли этот законный HTML? Означает ли одно из значений data-foo
значение над другим? Могу ли я рассчитывать на полусовременные браузеры (IE >= 9), чтобы разобрать его без задыхания?
Или я собираюсь сделать что-то действительно глупо здесь?
Ответы
Ответ 1
Неправильно иметь одно и то же имя атрибута в элементе. Авторитетные ссылки для этого несколько сложны, поскольку старые версии HTML были номинально основаны на SGML, и ограничение подразумевается нормативной ссылкой на стандарт SGML. В HTML5 PR, раздел 8.1.2.3 Attributes явно говорит: "В одном и том же стартовом теге не должно быть двух или более атрибутов, имена которых не являются ASCII-регистро-независимыми совпадают друг с другом".
Что происходит на практике, так это то, что последний атрибут игнорируется. Ну, будущие браузеры могли бы сделать иначе. В DOM атрибуты отображаются как свойства элемента node, а также в объекте attributes
, поэтому естественного способа хранения двух значений не было бы.
Ответ 2
Это не технически корректно, но каждый браузер будет игнорировать повторяющиеся атрибуты в документах HTML и использовать первое значение (data-foo="bar"
в вашем случае).
Использование одного и того же имени атрибута дважды в теге считается внутренней ошибкой синтаксического анализа. Это может привести к тому, что ваш документ не будет проверяться, если это вас беспокоит. Однако важно понимать, что HTML 5 определяет ожидаемый результат даже для случаев, когда у вас есть "ошибка синтаксического анализа". Парсер разрешается останавливаться, когда он сталкивается с ошибкой, но если он не хочет останавливаться, он должен получить конкретный результат, описанный в спецификации. На практике никакие браузеры не останавливаются, когда сталкиваются с ошибками в документах HTML (XML/XHTML - это другое дело), поэтому все современные браузеры будут обрабатывать этот случай успешно и последовательно.
Спецификация HTML WHATWG описывает этот случай в раздел 12.2.4.33 "Состояние имени атрибута" :
Когда пользовательский агент покидает состояние имени атрибута (и перед его выпуском, если это необходимо), полное имя атрибута должно сравниваться с другими атрибутами одного и того же токена; , если уже есть атрибут на токене с точно таким же именем, то это ошибка синтаксического анализа, а новый атрибут должен быть удален вместе со значением, которое связано с ним (если оно есть).
См. также его описание "ошибки синтаксического анализа" из раздела 12.2 "Анализ HTML-документов" :
Некоторые точки в алгоритме синтаксического анализа считаются ошибками разбора. Обработка ошибок для ошибок синтаксического анализа четко определена (правила обработки, описанные в этой спецификации), но пользовательские агенты при анализе HTML-документа могут прервать парсер при первой ошибке синтаксического анализа, с которой они сталкиваются, не желают применять правила, описанные в этой спецификации.