son - principales etiquetas de html
¿Por qué una etiqueta de final perdida</ p> genera un párrafo vacío? (2)
La DTD HTML4 establece que la etiqueta final es opcional para el elemento párrafo, pero se requiere la etiqueta de inicio.
La declaración SGML para HTML4 establece que omittag es ''sí'', lo que significa que la etiqueta de inicio puede estar implícita.
La etiqueta final sigue las reglas de SGML :
una etiqueta de cierre se cierra, de vuelta a la etiqueta de inicio coincidente, todas las etiquetas de inicio intermedias no cerradas con etiquetas de final omitidas
Los cuadros de bloque anónimos se generan para los elementos en línea, como los nodos de texto, por lo que no necesitan estar envueltos por el elemento de párrafo.
Hay un hilo en la base de datos de errores de Mozilla que explica este comportamiento:
Aquí hay un comentario relevante de Boris Zbarsky :
En realidad, tal como lo entiendo, el análisis adecuado de SGML / HTML requiere que nos comportemos de esta manera. Es decir, el ''<'' de la próxima etiqueta es una forma válida de cerrar el marcado de una etiqueta anterior ...
Y resumido por Ian Hickson :
El principio básico en el trabajo aquí, parece, es que el marcado está arreglado al retrasar las etiquetas de cierre hasta que se hayan cerrado todos los demás elementos abiertos, y no se intenta hacer que el DOM siga el DTD HTML.
Referencias
Aparentemente, si tiene una etiqueta de cierre </p>
sin una etiqueta de inicio coincidente dentro del elemento de body
, la mayoría de los navegadores, si no todos, generarán un párrafo vacío en su lugar:
<!DOCTYPE html>
<title></title>
<body>
</p>
</body>
Incluso si existe texto alrededor de la etiqueta final, nada de esto forma parte de este elemento p
; siempre estará vacío y los nodos de texto siempre existirán por sí solos:
<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</body>
Si los contenidos anteriores del body
están envueltos en etiquetas <p>
y </p>
... te dejaré adivinar lo que sucede:
<!DOCTYPE html>
<title></title>
<body>
<p>some text</p>more text</p>
</body>
Curiosamente, si la etiqueta </p>
no está precedida por una etiqueta <body>
o </body>
, todos los navegadores excepto IE9 y anteriores no generarán un párrafo vacío (IE ≤ 9 por otro lado siempre creará uno, mientras que IE10 y posterior se comportan igual que todos los demás navegadores):
<!DOCTYPE html>
<title></title>
</p>
<!DOCTYPE html>
<title></title>
</p><body>
<!DOCTYPE html>
<title></title>
</p></body>
No puedo encontrar ninguna referencia que estipule que una etiqueta de cierre con una etiqueta de inicio correspondiente no genere un elemento vacío, pero eso no debería sorprender si se tiene en cuenta que ni siquiera es un HTML válido. De hecho, solo encontré buscadores para hacer esto con el elemento p
(¡y hasta cierto punto también con el elemento br
!), Pero no con ninguna explicación del por qué.
Sin embargo, es bastante coherente en todos los navegadores, utilizando analizadores de HTML tradicionales y analizadores de HTML5, y aplica tanto en modo peculiar como en modo estándar. Entonces, probablemente sea justo deducir que esto es por compatibilidad con versiones anteriores o comportamiento heredado.
De hecho, encontré este comentario en una respuesta a una pregunta algo relacionada , que básicamente lo confirma:
La razón por la cual las etiquetas <p> son válidas no cerradas es que originalmente <p> se definió como un marcador de "nuevo párrafo", en lugar de ser un elemento contenedor. Equivalente a ser un marcador de "nueva línea". Puedes verlo así definido en este documento de 1992: http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html y este de 1993: http: //www.w3. org / MarkUp / draft-ietf-iiir-html-01.txt Debido a que había páginas web anteriores al cambio y los analizadores del navegador siempre han sido lo más compatibles posible con el contenido web existente, siempre ha sido posible utilizar <p> de esa manera.
Pero no explica por qué los analizadores tratan una etiqueta final explícita </p>
(con la barra diagonal) como simplemente ... una etiqueta, y generan un elemento vacío en el DOM. ¿Es esto parte de alguna convención de manejo de errores del analizador desde hace mucho tiempo cuando la sintaxis no estaba tan estrictamente definida como lo era más recientemente o algo así? Si es así, ¿está documentado en algún lugar?
Que se requiere está documentado en HTML5. Ver http://dev.w3.org/html5/spec/tree-construction.html#parsing-main-inbody y buscar An end tag whose tag name is "p"
y dice:
Si la pila de elementos abiertos no tiene un elemento en el alcance del botón con el mismo nombre de etiqueta que el del token, este es un error de análisis; actuar como si se hubiera visto una etiqueta de inicio con el nombre de etiqueta "p", luego volver a procesar el token actual.
Lo que se traduce al inglés significa crear un elemento p
si la etiqueta </p>
no puede coincidir con una etiqueta <p>
existente.
Por qué es así, es más difícil de determinar. Usualmente, esto se debe a que algunos navegadores en el pasado hacían que esto sucediera como un error, y las páginas web confiaban en el comportamiento, por lo que otros navegadores también tenían que implementarlo.