Suponga que desea mostrar una alerta con el contenido de cadena de <!-- Comment --> <script type="text/javascript"></script>
en JavaScript en una página HTML. Puedes hacerlo con el siguiente código:
<!DOCTYPE html> <html> <head> <title>Quoting</title> </head> <body> <script type="text/javascript"> alert('<!-- Comment --> <script type="text/javascript"></script\u003E'); </script> </body> </html>
Nótese aquí el carácter >
citado en la parte </script>
del texto. Esto utiliza un escape Unicode de JavaScript para evitar que el analizador HTML interprete esta parte del literal de la cadena como el final de la etiqueta del script. El código anterior funciona perfectamente en FF, Chrome, IE.
Ahora intente aplicar las comillas >
también al final del comentario dentro de la cadena literal. Esto no debería cambiar nada, porque la sintaxis de comentarios XML no debe interpretarse dentro de las etiquetas de script en HTML (y obviamente no se interpreta, porque la sintaxis de comentarios se mostró en la alerta):
<!DOCTYPE html> <html> <head> <title>Quoting</title> </head> <body> <script type="text/javascript"> alert('<!-- Comment --\u003E <script type="text/javascript"></script\u003E'); </script> </body> </html>
Curiosamente, este código se rompe: la alerta no se imprime cuando se carga la página. El problema se puede reproducir al menos en FF, Chrome e IE. ¿Me estoy perdiendo algo en las especificaciones, o es un error "independiente del navegador" en el analizador HTML de todos los principales navegadores?
El inspector DOM muestra lo siguiente:
Parece que el resto del documento se interpreta como parte del script en este caso.
¿Algunas ideas?
Esto no es un error.
El primer <
pone el analizador en datos de Script con un estado de signo menor que el !
lo pone en estado de inicio de escape de datos de secuencia de comandos y así sucesivamente.
Reemplazar el >
que terminó el comentario HTML con una secuencia de escape significa que no sale del estado "lidiando con un comentario" hasta que llega al final del documento HTML.
Es un artefacto histórico del código HTML inicial utilizado para permitir scripts en línea sin que el código fuente de JS apareciera en la página para navegadores que no admitían el elemento <script>
.