2009-09-24 24 views
19

Ho visto questo su ogni Yahoo! news page, in fondo del codice sorgente,
e non è riuscito a capire? perché si rompono il parola script come questo.
Che cosa significa: "document.write ('<SCR' + 'IPT ... "

qualcuno sa se c'è un motivo per questo?

document.write("<scr"+"ipt language=javascript src=http://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>"); 

risposta

39

considerare questo esempio semplificato:

<script> 
document.write("something </script> something"); 
</script> 

del navigatore parser HTML avrebbe visto il </script> all'interno della stringa JavaScript e interpretare che come la fine dell'elemento script.

Il parser HTML non conosce la sintassi JavaScript - tutto ciò che sa è che l'elemento <script> termina al successivo </script>.

(Si sa anche che non si può avere nidificato <script> elementi, quindi la rottura della apertura <script> così come la chiusura </script> nel tuo esempio.)

+13

Nota : Allo stesso modo si comporta la colorazione del codice in SO. Si noti che "qualcosa" viene trattato come contenuto di testo all'esterno dell'elemento di script. –

+1

In realtà, no, l'elemento SCRIPT termina alla prima occorrenza di " "Vedi: http://www.w3.org/TR/html4/types.html#type-cdata – kangax

+1

Si tratta di una soluzione alternativa per i vecchi browser o si applica anche ai browser moderni? – hasen

3

in modo che non venga valutata, ma viene inserito come una stringa.

3

È un cattivo modo per impedire ai validatori XML/XHTML e HTML di urlare al codice sorgente.

+2

Quindi, perché Google Analytics utilizza questo metodo se è danneggiato? "document.write (unescape ("% 3Cscript src = '"+ gaJsHost +" google-analytics.com/ga.js "... perché lo fanno anche con document.write Non capisco. – vsync

0

Alcuni browser tendono ad "agire" a digiunare quando analizzando un documento e provando immediatamente ad eseguire il javascript quando trovano un tag script (anche se è esso stesso in un pezzo di js). Per evitare ciò, si rompono le decalifiche del tag.

+0

Non ho capito bene cosa hai appena detto, puoi fornire ulteriori letture sull'argomento per favore? è molto molto interessante. – vsync

+0

Diciamo che apri una pagina con IE, che ha document.write ('

4

Supponiamo di scrivere uno strumento che rileva l'inizio e la fine dei blocchi di script in un blocco di testo. Supponiamo che si vede

<blah><blahdeblah><script> 

blah blah blah 

blah 

print("</script>") 

print("<script>") 

blah 

</script> 

</blahdeblah></blah> 

Senza conoscere la sintassi del linguaggio di script, come fa il vostro strumento di sapere che questo è uno blocco di script e non due blocchi di script con ") bla tra di loro?

Un browser web è .. un tale strumento e 'una pratica ragionevole per essere sicuri di non confondere il browser web da non aver mai <script> o </script> nel file a meno che non sia in realtà un tag script

0

per una discussione completa di questo, vedi:
    http://www.wwco.com/~wls/blog/2007/04/25/using-script-in-a-javascript-literal/

La risposta breve è che il codice viene analizzato in due passaggi distinti.

Il primo è XML. Ciò significa che l'elementoSCRIPT > sta cercando </SCRIPT >. È importante ricordare che gli elementi XML sono indipendenti dal contenuto. Ciò significa che il parser non sa eppure che c'è JavaScript lì.

Una volta che ha il contenuto del > elemento < SCRIPT, quindi esso elabora quel pezzo di testo, che presumibilmente è JavaScript.

Separando il tag con un operatore di concatenazione di stringhe si impedisce a una costante di far scattare la fase XML.

Una soluzione semplice è mettere & lt; e & gt; nel testo Javascript.

+2

Tutto ok, tranne che è analizzato come HTML (cioè SGML), non XML. L'HTML ha una dicitura molto specifica per ''. Quindi perché questo trucco JS funziona. XML, d'altra parte, si limiterebbe a barf sul primo '