Почему браузеры все еще вводят <tbody>в HTML5? - PullRequest
33 голосов
/ 20 сентября 2011

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

И IE9, и Chrome14 регистрируют TBODY как tagName элемента внутри <table>

Спецификация HTML5 в <table> четко гласит:

с последующим указанием нуля или нескольких элементов tbody или одного или нескольких элементов tr

Кроме того. В спецификации HTML5 <tr> четко указано:

Являясь дочерним элементом элемента таблицы, после любых элементов caption, colgroup и thead, но только в том случае, если отсутствуют элементы tbody, являющиеся дочерними элементами элемента table.

Почему браузеры портят мой DOM и вставляют <tbody> при

  • Я не просил один
  • Совершенно верно без одного

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

Ответы [ 6 ]

39 голосов
/ 20 сентября 2011

Ответ «обратная совместимость» не имеет абсолютно никакого смысла, поскольку я специально выбрал тип документа HTML5.

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

Я процитирую соответствующую часть синтаксического анализатора HTML5description :

8.2.5.4.9 Режим вставки "в таблицу"

...

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

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

18 голосов
/ 20 сентября 2011

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

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

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

Правила разбора таблицы

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

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

7 голосов
/ 20 сентября 2011

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

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

5 голосов
/ 21 сентября 2011

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

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

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

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

3 голосов
/ 20 сентября 2011

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

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

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

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

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

1 голос
/ 20 сентября 2011

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

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