Cosa significa uno script-Tag con src AND contenuto?


122

Esempio dal pulsante +1 di Google:

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

Il tag dello script ha un attributo e contenuto src . Cosa significa e come funziona?


Firebug Lite utilizza questo metodo: getfirebug.com/firebuglite
Brad

Risposte:


71

Browser diversi lo trattano in modo diverso. Alcuni eseguono il contenuto solo se srcè incluso senza errori. Alcuni lo eseguono dopo aver tentato di includere lo srcscript, indipendentemente dal successo. Poiché questo comportamento è inaffidabile (e proibito in HTML5 ), dovrebbe essere evitato.

Google non fa affidamento su un comportamento specifico. Poiché il contenuto è solo un oggetto letterale (un valore), eseguirlo in realtà non farebbe nulla se non causare un errore silenzioso. Il codice di Google esamina il contenuto del scripttag stesso e regola il suo comportamento in base a quello.


2
Esiste un modo più intelligente per lo script di esaminare il contenuto del proprio tag di script (in particolare), piuttosto che passare attraverso il DOM?
Karl Knechtel

11
Su tutti i browser con cui ho lavorato, il contenuto dello script non verrà mai eseguito se l' srcattributo è presente, e in realtà non è realmente un oggetto letterale, quel codice produrrebbe un SyntaxErrorse eseguito, è semplicemente "testo JSON" che lo script utilizzerà da solo in seguito.
CMS

2
@Karl utilizzato all'interno di un file .js esterno, questo ti darà il contenuto del nodo <script> attualmente in esecuzione: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; non penso che ci sia alcun modo per recuperare il contenuto di un nodo di script che non implichi toccare il DOM .
bagno digitale

@CMS funziona su tutti i browser tranne IE. Puoi vederlo qui
Jose Faeti

1
@jose - il tuo esempio non è quello a cui si riferiva CMS. Se il codice viene eseguito come un'istruzione autonoma, è un errore di sintassi. Il tuo esempio (e quello di Google) "funziona" solo perché il contenuto dell'elemento script è ignorato a causa dell'attributo src .
RobG

23

Se un elemento di script ha un attributo src , il contenuto deve essere ignorato, qualsiasi altro comportamento non è conforme.

Nei blog è stato suggerito (come hack) di inserire il contenuto nell'elemento sapendo che non verrà valutato, quindi utilizzare metodi DOM per ottenere il contenuto come una stringa e valutarlo o inserirlo in un nuovo elemento di script. Nessuna di queste è una buona idea.


4
Perché questa non è una buona idea? E se viene utilizzato per inizializzare un plugin di terze parti?
thekingoftruth

13

Secondo la bozza della specifica HTML5 , gli <script>elementi con srcattributi dovrebbero avere solo codice commentato, che ha lo scopo di fornire documentazione per lo script. Tuttavia, non sembra che Google sia conforme a questa specifica.


13

Dopo che lo script è stato caricato, guarda all'interno del proprio tag script per accedere al suo contenuto.

Userà un codice simile a questo:

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

Per gentile concessione di John Resig .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.