w3schools thead tfoot colspan html html5

tfoot - thead html



¿Por qué los navegadores todavía inyectan<tbody> en HTML5? (6)

Ejemplo de tipo de documento HTML5 .

Tanto IE9 como Chrome14 registran TBODY como el tagName del elemento dentro de la <table>

La especificación de HTML5 en <table> indica claramente:

seguido de cero o más elementos tbody o uno o más elementos tr

Además. La especificación de HTML5 en <tr> establece claramente:

Como elemento secundario de un elemento de tabla, después de cualquier elemento de título, colgrupo y tema, pero solo si no hay elementos tbody que sean hijos del elemento de tabla.

¿Por qué los navegadores corrompen mi DOM e inyectan un <tbody> cuando

  • No pedí uno
  • Es perfectamente válido sin uno

La respuesta de "compatibilidad hacia atrás" no tiene absolutamente ningún sentido porque he optado específicamente por un doctype HTML5.


La respuesta de "compatibilidad hacia atrás" no tiene absolutamente ningún sentido porque he optado específicamente por un doctype HTML5.

Sin embargo, los navegadores no diferencian entre las versiones de HTML. Los documentos HTML con doctype HTML5 y con doctype HTML4 (con la pequeña excepción del doctype de transición HTML4 sin URL en FPI) se analizan y se procesan de la misma manera.

Citaré la parte relevante de la descripción del analizador HTML5 :

8.2.5.4.9 El modo de inserción "en la mesa"

...

Una etiqueta de inicio cuyo nombre de etiqueta es uno de: "td", "th", "tr"

Actúa como si se hubiera visto un token de etiqueta de inicio con el nombre de etiqueta "tbody", luego vuelve a procesar el token actual.


Desde mi experiencia, los navegadores no diferencian entre documentos HTML5 y HTML4. Se comportan igual para ambos. El <!doctype html> no desencadena ningún comportamiento especial en los navegadores.

Y también <!doctype html> no está reservado para "documentos HTML5", es el tipo de documento más simple que activa el modo estándar.


Esto se debe a "razones históricas" (es decir, compatibilidad con versiones anteriores, algo que es muy importante para HTML):

Por razones históricas, ciertos elementos tienen restricciones adicionales más allá incluso de las restricciones dadas por su modelo de contenido.

Un elemento de table no debe contener elementos tr , aunque estos elementos están permitidos técnicamente dentro de table elementos de table acuerdo con los modelos de contenido descritos en esta especificación. (Si un elemento tr se coloca dentro de una table en el marcado, de hecho implicará una etiqueta de inicio tbody antes).

Tenga en cuenta que esta cita es de la sección "Sintaxis HTML" . Esta sección se aplica solo a documentos, herramientas de autoría y generadores de marcas, y explícitamente no a los inspectores de conformidad (que deben usar el algoritmo de análisis HTML ).

Entonces: La especificación dice que se permite el uso de tr fuera de tbody según el modelo de contenido y la especificación de análisis sintáctico, pero cualquier cosa que genere HTML (incluido USTED) debe usar tbody .


Falta por completo la parte en la especificación de HTML5 que especifica cómo se construye el árbol .

La especificación le permite escribir una table sin el elemento tbody como está implícito. Al igual que si se salta las etiquetas html , head o body apertura o cierre, su página aún se puede representar correctamente.

Supongo que le gustaría que el DOM contenga un body para su contenido en caso de que se omita por algún motivo. Lo mismo vale para tbody . Se agrega porque supone explícitamente que olvidó agregarlo usted mismo.

Las reglas para el análisis de tabla

Una etiqueta de inicio cuyo nombre de etiqueta es uno de: "td", "th", "tr"

Actúa como si se hubiera visto un token de etiqueta de inicio con el nombre de etiqueta "tbody", luego vuelve a procesar el token actual.


Gran parte de esto se debe a que HTML5 fusiona el sucesor de HTML 4 y XHTML 1.x en una única especificación.

Cuando se introdujo XHTML 1.0 y los navegadores comenzaron a experimentar con el uso de un analizador XML, se encontraron con un problema. Los autores estaban acostumbrados a escribir <table> s sin <tbody> s. Como un analizador XML no permite inferir etiquetas como lo hacían los analizadores HTML, la mejor manera de ayudar a los autores a hacer la transición a XHTML (lo cual parecía una buena idea en ese momento) era hacer que las tablas se procesaran adecuadamente al permitir <tr> s ser los hijos directos de <table> dentro del DOM. (El DOM es igual tanto como sea posible, independientemente de si se originó a partir de un análisis sintáctico de HTML o un análisis XML). Por lo tanto, los navegadores implementaron soporte para esto.

Ahora el modelo de contenido HTML5 se comparte entre las serializaciones HTML y XHTML de HTML5, por lo que debe permitir ambos arreglos, es decir, con o sin tbody.

Por otro lado, en la sección sobre "La sintaxis de HTML" (que no se aplica al analizador XML), deja en claro que un análisis de HTML deducirá las etiquetas de tbody.

Cuando <table><tr><td>my text</td></tr></table> se sirve como text/html la estructura de tabla creada en el DOM tendrá el tr como hijo directo de un tbody que es el hijo directo de la mesa. El modelo de contenido HTML5 dice que esto está bien.

Cuando <table><tr><td>my text</td></tr></table> se sirve como application/xhtml+xml la estructura de tabla creada en el DOM tendrá el tr como un elemento directo de la tabla . El modelo de contenido HTML5 dice que esto también está bien.

También es posible crear un tr como hijo directo de la tabla a través de scripts. Por la misma razón, los navegadores tratarán esto como una fila de la tabla como la mayoría de la gente espera.


La compatibilidad con versiones anteriores no se trata solo del tipo de documento, las secuencias de comandos pueden depender de un elemento tbody que esté allí.