2011-06-29 14 views
108

Esempio da Googles pulsante +1:Che cosa significa uno script-tag con src AND content?

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

il tag script ha uno src-attributo e contenuti. Che cosa significa e come funziona?

+0

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

risposta

63

Diversi browser lo trattano in modo diverso. Alcuni eseguono il contenuto solo se lo src è incluso senza errori. Alcuni lo eseguono dopo aver tentato di includere lo script src, indipendentemente dal successo. Poiché questo comportamento non è affidabile (e prohibited in HTML5), dovrebbe essere evitato.

Google non sta facendo affidamento su alcun comportamento specifico. Dato che il contenuto è solo un oggetto letterale (un valore), eseguirlo in realtà non farebbe nulla tranne che causare un errore silenzioso. Il codice di Google esamina i contenuti del tag script e ne modifica il comportamento in base a tale.

+2

Esiste un modo più intelligente per lo script di esaminare i contenuti del proprio tag di script (in particolare) rispetto al DOM? –

+9

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

+0

@CMS Noted [limite di caratteri] –

20

Se un script element ha una src attributo , il contenuto deve essere ignorata, qualsiasi altro comportamento è non conforme.

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

+3

Perché non è una buona idea? Cosa succede se è utilizzato per inizializzare un plug-in di terze parti? – thekingoftruth

13

Secondo il HTML5 draft specification, <script> elementi con src attributi dovrebbe solo hanno commentato-out di codice, che è destinato a dare la documentazione per lo script. Tuttavia, Google non sembra conforme a queste specifiche.

13

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

Si utilizzerà un codice simile a questo:

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

Per gentile concessione di John Resig.