</script>
tiene que separarse porque, de lo contrario, terminaría el <script></script>
bloque de cierre demasiado pronto. Realmente debería dividirse entre el <
y el /
, porque se supone que un bloque de script (de acuerdo con SGML) debe ser terminado por cualquier secuencia de etiqueta final abierta (ETAGO) (es decir </
) :
Aunque los elementos STYLE y SCRIPT usan CDATA para su modelo de datos, para estos elementos, los agentes de usuario deben manejar CDATA de manera diferente. El marcado y las entidades deben tratarse como texto sin formato y pasarse a la aplicación tal cual. La primera aparición de la secuencia de caracteres " </
" (delimitador abierto de etiqueta final) se trata como terminando el final del contenido del elemento. En documentos válidos, esta sería la etiqueta final para el elemento.
Sin embargo, en la práctica, los navegadores solo terminan de analizar un bloque de script CDATA en una </script>
etiqueta de cierre real .
En XHTML no existe un manejo especial para los bloques de script, por lo que cualquier <
(o &
) carácter dentro de ellos debe ser &escaped;
como en cualquier otro elemento. Sin embargo, los navegadores que analizan XHTML como HTML de la vieja escuela se confundirán. Existen soluciones alternativas que involucran bloques CDATA, pero es más fácil simplemente evitar el uso de estos caracteres sin escape. Una mejor manera de escribir un elemento de script desde un script que funcione en cualquier tipo de analizador sería:
<script type="text/javascript">
document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>
\/
es una secuencia de escape válida para/
, entonces, ¿por qué no usar eso en lugar de esos escapes literales de cadena para<
? Por ejdocument.write('<script src=foo.js><\/script>');
. Además,</script>
no es la única secuencia de caracteres que puede cerrar un<script>
elemento. Más información aquí: mathiasbynens.be/notes/etago<\/script>
está bien en este caso, pero solo funcionaría en HTML; en XHTML sin envoltura adicional de la sección CDATA, sigue siendo un error de buena formación. También puede usar los\x3C
atributos del controlador de eventos en línea donde<
también serían inválidos en HTML y XHTML, por lo que tiene una aplicabilidad más amplia: si estuviera eligiendo una forma fácil y automática de escapar de caracteres sensibles en literales de cadena JS para todos los contextos, eso es por el que yo iría.<
se puede utilizar en los atributos del controlador de eventos en línea. html5.validator.nu/… Y tienes razón sobre la compatibilidad XHTML de\x3C
un sich, pero dado que XHTML no es compatibledocument.write
(oinnerHTML
) de todos modos, no veo cómo eso es relevante.document.write
es irrelevante, simplemente es el ejemplo. El OP podría haber usado innerHTML, se trata de ocultar ocultar la</
secuencia de caracteres del analizador de marcado, donde sea que ocurra. Es solo que la mayoría de los analizadores lo toleran dentro de un elemento de script cuando estrictamente no deberían (pero los analizadores HTML son muy tolerantes). Sin embargo, tienes razón, eso es<\/
suficiente en todos los casos para HTML.document.write('<script src="foo.js">\x3C/script>')
parece ser suficiente en todos los navegadores de vuelta a IE6. (Omití el atributo type porque no es obligatorio en HTML5, ni se aplica como lo requiere ningún navegador).Aquí hay otra variación que he usado cuando quiero generar una etiqueta de script en línea (para que se ejecute inmediatamente) sin necesidad de ninguna forma de escape:
(Nota: al contrario de la mayoría de los ejemplos en la red, no estoy configurando
type="text/javascript"
ni la etiqueta adjunta ni la generada: no hay ningún navegador que no tenga eso como predeterminado, por lo que es redundante, pero tampoco dañará, si no estás de acuerdo)fuente
Creo que es para evitar que el analizador HTML del navegador interprete el <script>, y principalmente el </script> como la etiqueta de cierre del script real, sin embargo, no creo que usar document.write sea una excelente idea para evaluar el script bloques, por qué no usar el DOM ...
fuente
La solución que Bobince publicó funciona perfectamente para mí. También quería ofrecer un método alternativo para futuros visitantes:
En este ejemplo, he incluido una carga condicional para jQuery para demostrar el caso de uso. Espero que sea útil para alguien!
fuente
El
</script>
analizador HTML interpreta el interior de la cadena Javascript literalmente como una etiqueta de cierre, causando un comportamiento inesperado ( ver ejemplo en JSFiddle ).Para evitar esto, puede colocar su javascript entre comentarios (este estilo de codificación era una práctica común, cuando Javascript no era compatible con los navegadores). Esto funcionaría ( ver ejemplo en JSFiddle ):
... pero para ser honesto, usar
document.write
no es algo que consideraría una mejor práctica. ¿Por qué no manipular el DOM directamente?fuente
append
lugar deappendChild
. Corrigió la respuesta. ¡Gracias por notarlo!