263 votes

Pourquoi diviser le <script> tag when writing it with document.write()?

Pourquoi certains sites (ou les annonceurs qui donnent aux clients du code javascript) emploient une technique de fractionnement de l' <script> et/ou </script> tags dans document.write() des appels?

J'ai remarqué que Amazon fait aussi bien, par exemple:

<script type='text/javascript'>
  if (typeof window['jQuery'] == 'undefined') document.write('<scr'+'ipt type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></sc'+'ript>');
</script>

366voto

bobince Points 270740

</script> a être brisé parce que sinon ce serait la fin de l'enfermant <script></script> bloc trop tôt. Vraiment, il devrait être partagé entre l' < et de la /, en raison d'un bloc de script est censé (selon SGML) pour être résiliée par l'une balise de fin ouverte (ETAGO) séquence (c - </):

Bien que le STYLE et les éléments de SCRIPT utiliser CDATA pour leur modèle de données, pour ces éléments, CDATA doivent être traitées différemment par les agents utilisateurs. Le balisage et les entités doivent être traités en tant que texte brut et transmises à l'application. La première occurrence de la séquence de caractères "</" (balise de fin ouverte séparateur) est considérée comme la résiliation de la fin du contenu de l'élément. Dans des documents valides, ce serait la fin de la balise de l'élément.

Cependant, dans la pratique, uniquement pour les navigateurs de la fin de l'analyse d'une CDATA bloc de script sur un effectif </script> proche-tag.

Dans le XHTML n'est pas un traitement spécial pour des blocs de script, de sorte que tout < (ou &) caractère à l'intérieur d'eux doit être &escaped; comme dans n'importe quel autre élément. Cependant, les navigateurs que sont l'analyse XHTML est de la vieille école HTML vont se confondre. Il y a des solutions impliquant CDATA blocs, mais il est plus facile pour éviter d'utiliser ces caractères sans échappement. Une meilleure façon de l'écriture d'un élément de script à partir d'un script qui fonctionne sur l'un ou l'autre type d'analyseur serait:

<script type="text/javascript">
    document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>

31voto

Stoffe Points 135

Voici une autre variante que j'ai utilisé lorsque l'on veut générer une balise de script inline (de sorte qu'il s'exécute immédiatement) sans avoir besoin d'une forme d'évasions:

<script>
    var script = document.createElement('script');
    script.src = '/path/to/script.js';
    document.write(script.outerHTML);
</script>

(Note: contrairement à la plupart des exemples sur le net, je ne suis pas de réglage type="text/javascript" sur ni la balise englobante, ni l'généré: il n'y a pas de navigateur de ne pas avoir comme valeur par défaut, et il est donc redondant, mais n'aura pas de mal non plus, si vous êtes en désaccord).

20voto

CMS Points 315406

Je pense, pour empêcher le navigateur de l'analyseur HTML à partir de l'interprétation de la balise <script> et surtout </script> comme la balise de fermeture du script en lui-même, cependant, je ne pense pas que l'utilisation de document.écrire est une excellente idée pour l'évaluation des blocs de script, pourquoi ne pas utiliser le DOM...

var newScript = document.createElement("script");
...

8voto

Jongosi Points 446

La solution Bobince posté fonctionne parfaitement pour moi. J'ai voulu proposer une méthode alternative aussi bien pour les futurs visiteurs:

if (typeof(jQuery) == 'undefined') {
    (function() {
        var sct = document.createElement('script');
        sct.src = ('https:' == document.location.protocol ? 'https' : 'http') +
          '://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js';
        sct.type = 'text/javascript';
        sct.async = 'true';
        var domel = document.getElementsByTagName('script')[0];
        domel.parentNode.insertBefore(sct, domel);
    })();
}

Dans cet exemple, j'ai inclus une condition de chargement de jQuery pour démontrer de cas d'utilisation. J'espère que c'est utile pour quelqu'un!

-3voto

PhiLho Points 23458

Je dirais que c'est pour éviter un bug de certains navigateurs qui ne devrait pas s'arrêter à la section script sur un tag dans un JS chaîne...

Personnellement, devrais-je utiliser ce type de code, je préfère écrire quelque chose comme " <\x2Fscript>' (par exemple) au lieu de '</'+'script>', au moins, il évite une opération... Et il semble plus frais, moins comme un mauvais hack... :-P

[EDIT 2012-08] OK, selon la accepté de répondre, il n'est pas un bug, c'est à la suite de la spec, même si l'on peut dire que le bug est dans les specs..., ainsi que d'autres points comme le non -- dans les commentaires HTML, c'est gênant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X