</script>
precisa ser interrompido porque, caso contrário, encerraria o <script></script>
bloco anexo muito cedo. Realmente, ele deve ser dividido entre the <
e the /
, porque um bloco de script deve (de acordo com SGML) terminar com qualquer sequência de fim de tag aberta (ETAGO) (ou seja </
) :
Embora os elementos STYLE e SCRIPT usem CDATA para seu modelo de dados, para esses elementos, o CDATA deve ser tratado de maneira diferente pelos agentes do usuário. A marcação e as entidades devem ser tratadas como texto bruto e passadas para o aplicativo como estão. A primeira ocorrência da sequência de caracteres " </
" (delimitador aberto da tag final) é tratada como finalização do final do conteúdo do elemento. Em documentos válidos, essa seria a tag final do elemento.
No entanto, na prática, os navegadores apenas finalizam a análise de um bloco de script CDATA em uma </script>
marca de fechamento real .
No XHTML não existe um tratamento especial para blocos de script, portanto, qualquer <
(ou &
) caractere dentro deles deve ser &escaped;
semelhante a qualquer outro elemento. No entanto, os navegadores que estão analisando XHTML como HTML da velha escola ficarão confusos. Existem soluções alternativas que envolvem blocos CDATA, mas é mais fácil simplesmente evitar o uso desses caracteres sem escape. Uma maneira melhor de escrever um elemento de script a partir de um script que funcione em qualquer tipo de analisador seria:
<script type="text/javascript">
document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>
\/
é uma sequência de escape válida para/
, então, por que não apenas usá-la em vez dessas sequências literais de escape<
? Por exemplodocument.write('<script src=foo.js><\/script>');
. Além disso,</script>
não é a única sequência de caracteres que pode fechar um<script>
elemento. Mais informações aqui: mathiasbynens.be/notes/etago<\/script>
está bem neste caso, mas só funcionaria em HTML; no XHTML sem quebra de seção CDATA extra, ainda é um erro de formação. Além disso, você pode usar\x3C
atributos de manipulador de eventos em linha, onde<
também seria inválido tanto em HTML quanto em XHTML, para ter uma aplicabilidade mais ampla: se eu estivesse escolhendo uma maneira fácil e automatizada de escapar de caracteres sensíveis em literais de string JS para todos os contextos, isso é o que eu escolheria.<
pode ser usado em atributos de manipulador de eventos embutidos. html5.validator.nu/… E você está certo sobre a compatibilidade XHTML de\x3C
um sich, mas como o XHTML não suportadocument.write
(ouinnerHTML
) de qualquer maneira, não vejo como isso é relevante.document.write
é irrelevante, apenas é o exemplo. O OP poderia ter usado innerHTML, é sobre como ocultar a</
sequência de caracteres do analisador de marcação, onde quer que ocorra. É que a maioria dos analisadores o tolera dentro de um elemento de script quando estritamente não deveriam (mas os analisadores de HTML são muito tolerantes). Você está correto, porém,<\/
em todos os casos, basta para HTML.document.write('<script src="foo.js">\x3C/script>')
parece ser suficiente em todos os navegadores do IE6. (Eu deixei de fora o atributo tipo porque não é exigido em HTML5, nem é imposta como exigido por qualquer browser.)Aqui está outra variação que eu usei ao querer gerar uma tag de script embutida (para que seja executada imediatamente) sem precisar de nenhuma forma de escape:
(Observação: ao contrário da maioria dos exemplos na rede, não estou definindo
type="text/javascript"
nem a tag anexa nem a gerada: não há navegador que não a tenha como padrão e, portanto, é redundante, mas também não prejudicará, se você discordar).fonte
Eu acho que é para impedir que o analisador HTML do navegador interprete o <script> e, principalmente, o </script> como a tag de fechamento do script real, no entanto, não acho que usar document.write seja uma excelente idéia para avaliar o script blocos, por que não usar o DOM ...
fonte
A solução que Bobince postou funciona perfeitamente para mim. Eu também queria oferecer um método alternativo para futuros visitantes:
Neste exemplo, incluí uma carga condicional para o jQuery demonstrar caso de uso. Espero que seja útil para alguém!
fonte
A parte
</script>
interna da string Javascript é interpretada pelo analisador HTML como uma tag de fechamento, causando comportamento inesperado ( veja o exemplo no JSFiddle ).Para evitar isso, você pode colocar seu javascript entre os comentários (esse estilo de codificação era uma prática comum, quando o Javascript era pouco suportado pelos navegadores). Isso funcionaria ( veja o exemplo no JSFiddle ):
... mas, para ser sincero, usar
document.write
não é algo que eu consideraria uma prática recomendada. Por que não manipular o DOM diretamente?fonte
append
vez deappendChild
. Corrigida a resposta. Obrigado por perceber!