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

Почему браузеры все еще вводят <tbody> в HTML5?

Пример документа HTML5.

Оба IE9 и Chrome14 log TBODY как tagName элемента внутри <table>

В спецификации HTML5 на <table> четко указано:

за которым следует либо ноль, либо больше элементов tbody или один или несколько элементов tr

Далее. В спецификации HTML5 на <tr> четко указано:

Как дочерний элемент таблицы, после любых элементов заголовка, colgroup и thead, но только если нет элементов tbody, которые являются дочерними элементами элемента таблицы.

Почему браузеры повреждают мою DOM и вводят <tbody>, когда

  • Я не просил одного
  • Это абсолютно справедливо без одного

Ответ "обратной совместимости" абсолютно нулевой смысл, потому что я специально выбрал для HTML5 doctype.

4b9b3361

Ответ 1

Ответ "обратной совместимости" абсолютно нулевой смысл потому что я специально выбрал для документа HTML5.

Однако браузеры не различают версии HTML. HTML-документы с HTML5 doctype и с HTML4 doctype (с небольшим исключением переходного документа типа HTML4 без URL-адреса в FPI) анализируются и отображаются одинаково.

Я приведу соответствующую часть описания парсера HTML5:

8.2.5.4.9 Режим ввода "в таблице"

...

Начальный тег, имя тега которого является одним из следующих: "td", "th", "tr"

Действуйте так, как будто токен начального тега с именем тега "tbody" был а затем переработать текущий токен.

Ответ 2

Полностью отсутствует часть спецификации HTML5, которая определяет, как построено дерево .

Спецификация позволяет вам написать table без элемента tbody, как он подразумевал. Так же, как если бы вы пропустили теги html, head или body открытия или закрытия, ваша страница все равно может быть правильно отображена.

Я предполагаю, что вы хотите, чтобы DOM содержал body для вашего контента, если он по какой-либо причине не учитывается. То же самое касается tbody. Он добавил, потому что он явно предполагает, что вы забыли добавить его сами.

Правила для разбора таблиц

Начальный тег, имя тега которого является одним из следующих: "td", "th", "tr"

Действуйте так, как если бы был замечен токен начального тега с именем тега "tbody", а затем обработал текущий токен.

Ответ 3

По моему опыту, браузеры не различают документы HTML5 и HTML4. Они ведут себя одинаково для обоих. <!doctype html> не вызывает каких-либо особых действий в браузерах.

И также <!doctype html> не зарезервировано для "документов HTML5" - это просто самый простой возможный тип, который запускает режим стандартов.

Ответ 4

Многое происходит из-за того, что HTML5 объединяет преемника в HTML 4 и XHTML 1.x в одну спецификацию.

Когда был введен XHTML 1.0, и браузеры начали экспериментировать с использованием синтаксического анализа XML, они столкнулись с проблемой. Авторы писали <table> без <tbody> s. Поскольку анализатору XML не разрешено выводить теги, такие как HTML-парсеры, лучший способ помочь авторам перейти на XHTML (который в то время казался хорошей идеей) заключался в том, чтобы заставить таблицы правильно отображать, разрешив <tr> быть прямыми детьми <table> внутри DOM. (DOM как можно больше, независимо от того, возникла ли она из синтаксиса HTML или синтаксического анализа XML.) Таким образом, браузеры реализовали поддержку для этого.

Теперь модель содержимого HTML5 делится между сериализацией HTML и XHTML HTML5, поэтому она должна учитывать оба устройства, то есть с или без tbody.

С другой стороны, в разделе "Синтаксис HTML" (который не применяет к синтаксическому анализатору XML) он ясно показывает, что синтаксический анализ HTML выведет теги tbody.

Когда <table><tr><td>my text</td></tr></table> обслуживается как text/html, структура таблицы, созданная в DOM, будет иметь tr как прямой дочерний элемент tbody, который является прямым дочерним элементом таблицы. Модель содержимого HTML5 говорит, что это нормально.

Когда <table><tr><td>my text</td></tr></table> обслуживается как application/xhtml+xml, структура таблицы, созданная в DOM, будет иметь tr как прямой дочерний элемент таблицы. Модель содержимого HTML5 говорит, что это тоже нормально.

Также возможно создать tr в качестве прямого дочернего элемента таблицы через скрипты. По той же причине браузеры будут рассматривать это как строку таблицы, как это ожидают большинство людей.

Ответ 5

Это для "исторических причин" (т.е. обратная совместимость, что очень важно для HTML):

По историческим причинам некоторые элементы имеют дополнительные ограничения кроме даже ограничений, заданных их моделью контента.

Элемент

A table не должен содержать элементов tr, хотя эти элементы технически разрешены внутри элементов table в соответствии с модели контента, описанные в этом описании. (Если элемент trпомещается внутри table в разметке, на самом деле это подразумевает tbodyначинайте тег перед ним.)

Обратите внимание, что эта цитата из "Синтаксис HTML" . Этот раздел применяется только к документам, инструментам разработки и генераторам разметки и явно не к средствам проверки соответствия (которые должны использовать алгоритм синтаксического анализа HTML).

Итак: в спецификации указано, что использование tr вне tbody разрешено в соответствии с моделью контента и спецификацией синтаксического анализа, но все, что генерирует HTML (включая YOU), должно использовать tbody.

Ответ 6

Обратная совместимость - это не только о doctype, скрипты могут полагаться на элемент tbody.