Que signifie un script-Tag avec un contenu src AND?


122

Exemple tiré du bouton +1 de Google:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {"parsetags": "explicit"}
</script>

La balise de script a un attribut src et un contenu. Qu'est-ce que cela signifie et comment ça marche?


Firebug Lite utilise cette méthode: getfirebug.com/firebuglite
Brad

Réponses:


71

Différents navigateurs traitent cela différemment. Certains n'exécutent le contenu que si le srcest inclus sans erreur. Certains l'exécutent après avoir tenté d'inclure le srcscript, quel que soit le succès. Comme ce comportement n'est pas fiable (et interdit en HTML5 ), il doit être évité.

Google ne se fie à aucun comportement spécifique. Puisque le contenu n'est qu'un objet littéral (une valeur), son exécution ne ferait rien d'autre que provoquer une erreur silencieuse. Le code de Google examine le contenu de la scriptbalise elle-même et ajuste son comportement en fonction de cela.


2
Existe-t-il un moyen plus intelligent pour le script de regarder le contenu de sa propre balise de script (en particulier), que de passer par le DOM?
Karl Knechtel

11
Sur tous les navigateurs avec lesquels j'ai travaillé, le contenu du script ne sera jamais exécuté si l' srcattribut est présent, et n'est en fait pas vraiment un objet littéral, ce code produirait un SyntaxErrors'il est exécuté, c'est simplement "texte JSON" que le script utilisera par lui-même plus tard.
CMS

2
@Karl utilisé dans un fichier .js externe, cela vous donnera le contenu du nœud <script> en cours d'exécution: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; je ne pense pas qu'il existe un moyen de récupérer le contenu d'un nœud de script qui n'implique pas de toucher le DOM .
digitalbath

@CMS fonctionne sur tous les navigateurs sauf IE. Vous pouvez le voir ici
Jose Faeti

1
@jose - votre exemple n'est pas ce à quoi CMS faisait référence. Si le code est exécuté en tant qu'instruction autonome, il s'agit d'une erreur de syntaxe. Votre exemple (et celui de Google) "fonctionne" uniquement parce que le contenu de l'élément de script est ingéré en raison de l' attribut src .
RobG

23

Si un élément de script a un attribut src , le contenu doit être ignoré, tout autre comportement est non conforme.

Il a été suggéré dans les blogs (comme un hack) pour mettre le contenu dans l'élément sachant qu'il ne sera pas évaluée, puis utilisez les méthodes DOM pour obtenir le contenu en tant que chaîne et soit eval ou l' insérer dans un nouvel élément de script. Ni l'un ni l'autre ne sont une bonne idée.


4
Pourquoi ce n'est pas une bonne idée? Et s'il est utilisé pour initialiser un plugin tiers?
thekingoftruth

13

Selon le projet de spécification HTML5 , les <script>éléments avec des srcattributs ne devraient avoir que du code commenté, qui est destiné à fournir la documentation du script. Il ne semble cependant pas que Google se conforme à cette spécification.


13

Une fois le script chargé, il regarde à l'intérieur de sa propre balise de script pour accéder à son contenu.

Il utilisera un code similaire à celui-ci:

var scripts = document.getElementsByTagName("script");
var data = eval(scripts[scripts.length - 1].innerHTML);

Gracieuseté de John Resig .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.