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 ):
<script type="text/javascript">
<!--
if (jQuery === undefined) {
document.write('<script type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></script>');
}
// -->
</script>
... pero para ser honesto, usar document.write
no es algo que consideraría una mejor práctica. ¿Por qué no manipular el DOM directamente?
<script type="text/javascript">
<!--
if (jQuery === undefined) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', 'http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js');
document.body.appendChild(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).