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

Может ли элемент HTML иметь один и тот же атрибут дважды?

Я рассматриваю возможность написания кода, который создает HTML-тег, который может иметь повторяющиеся атрибуты, например:

<div data-foo="bar" class="some-class" data-foo="baz">

Является ли этот законный HTML? Означает ли одно из значений data-foo значение над другим? Могу ли я рассчитывать на полусовременные браузеры (IE >= 9), чтобы разобрать его без задыхания?

Или я собираюсь сделать что-то действительно глупо здесь?

4b9b3361

Ответ 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-документа могут прервать парсер при первой ошибке синтаксического анализа, с которой они сталкиваются, не желают применять правила, описанные в этой спецификации.