2009-02-17 16 views
18

Mi chiedevo perché l'annuncio di ancora utilizzare l'approccio document.write per l'inserimento del aggiungere nella paginaPerché usare document.write?

<script language="javascript" type="text/javascript"> 
    document.write("<script type='text/javascript' src='http://addomain/someadd.js'><\/sc" + "ript>"); 
</script> 

Perché è che non posso mettere

<script type='text/javascript' src='http://addomain/someadd.js'></script> 

Al posto della pubblicità ?

+1

Interessante cerchio duplicato in corso. – Ryan

risposta

8

Un tag di script tradizionale bloccherà la pagina durante il caricamento e l'esecuzione. Uno script caricato con document.write funzionerà in modo asincrono.Questo è il motivo per cui lo vedi su annunci o analisi, in quanto tali script non influenzano direttamente il contenuto della pagina.

+0

Non è vero, puoi accedere immediatamente al contenuto del tag script aggiunto con 'document.write', a patto che provenga da un nuovo tag script, a meno che non specifichi defer = true [Ecco la prova] (https: // jsfiddle.net/mendesjuan/eymsv7qc/) Ecco perché si usa 'document.write' quando è necessario aggiungere alcuni parametri dinamici allo script ma non si vuole gestire il caricamento asincrono della creazione di un nodo di script. –

+0

Che dire allora di

2

script mi ​​correggo, doc.write realizzati sono blocco - peggio di quanto se heh :) - ma come un avoider AdBlock E 'davvero debole, quindi posso solo concludere che è un meccanismo di SOP per l'aggiunta in modo dinamico params a una richiesta di script abusata.

Utilizzare la tecnica di inserimento DOM per evitare blocchi di script per bambini.

+0

Questo è quello che ho pensato, ma considerando che rende più lento il rendering delle pagine in tutti i miei test, non posso credere che questo sia effettivamente vero. Gli script inline e persino l'accodamento manuale al DOM producono tutti rendering più veloci (infatti document.write crea un blocco significativo rispetto al resto). –

+0

@annakata: hai un link che spiega questo con maggiori dettagli? Ho anche dubbi sul "blocco degli elusi". –

+0

No, è qualcosa in cui sono coinvolto professionalmente - ho visto i concorrenti invocare le tecniche doc.write e ho pensato che facesse parte di una soluzione di blocco (poiché il resto del codice si adatta allo schema comune). Risulta che doc.write è solo * veramente * cattivo, e sto dando alla concorrenza troppo credito :) – annakata

0

Non so per certo, ma potrebbero usarlo in modo che tutto il contenuto del sito Web sia caricato e mostrato all'utente, quindi gli annunci vengono caricati e mostrati.

+0

no - All'inizio pensavo che, ma doc.write ha creato script * sta * bloccando – annakata

0

per abbinare questo con regex e di togliere è facile:

<script type='text/javascript' src='http://addomain/someadd.js'></script> 

ma l'altra è più complessa e può essere scritto in diversi formati.

Penso che questo sia il motivo.

1

Questo metodo evita il caricamento dello script esterno se lo script attivo è disabilitato.

+2

se lo script è disabilitato nessun script sono comunque caricati - almeno in FF, non sono stati testati altrove, ma credo che questo sia vero – annakata

+0

Almeno alcuni browser più vecchi lo hanno fatto. – Gumbo

+0

Quindi, se lo script attivo è disabilitato, impedisce il caricamento del file? Dove è come se un tag di script fosse caricato (ma non eseguito)? –

5

Collaboro con una società di pubblicità sul Web e da quello che ho sentito, alcuni browser (non conoscono di nascosto quali) consentono di rilasciare tag di script nella pagina, ma non consentono di eseguire automaticamente i loro contenuti.

Quindi, per rimuoverlo, è necessario suddividere il tag di script in pezzi in modo che il browser non lo tratti come un tag di script, ma piuttosto come qualsiasi vecchio dato HTML. Quindi, mentre il DOM viene elaborato in serie, la prossima cosa che valuta, dopo aver scritto il tag dello script è ... hey, quel tag script che hai appena scritto.

A questo punto il tag di script viene valutato ed eseguito.

+0

Non sono sicuro di saperlo. Posso vedere come sarebbe trattato diversamente. –

+1

La nostra azienda ha ricevuto un codice simile da un'azienda pubblicitaria. Sono d'accordo con Paul: è fondamentalmente un metodo per ridurre la probabilità che lo script venga filtrato/ignorato. – Mayo

+1

Dovrei anche aggiungere che il codice che abbiamo ricevuto è stato ulteriormente offuscato con la concatenazione ... "" ... ha reso abbastanza ovvio quello che stavano facendo. – Mayo

5

Spesso questi script con scrittura document.write hanno stringhe dinamiche ad essi collegate per uscire dalla cache o per inviare alcune informazioni sul client all'ad server. Ho il sospetto che il tuo esempio è iniziato come qualcosa di simile

document.write("<script type='text/javascript' src='http://addomain/someadd.js?"+extrastuff+"'><\/sc" + "ript>"); 

ma ha ottimizzato nel corso del tempo, o è stato copiato e modificato da qualcuno che non ha capito il bit extrastuff. Ma come hai scritto non c'è differenza: i due modi in cui citi nella tua domanda sono funzionalmente uguali.

0

IMHO, questo non è solo inutile, ma anche errato. Le parentesi angolari non sono sfuggite, il che renderà il documento tecnicamente non valido HTML (anche se funzionerà in tutti i principali browser, perché provano a recuperare dagli errori dei codificatori). E nel caso in cui uno stia servendo il suo sito con le pagine XHMTL come application/xml+xhtml, document.write() non funzionerà affatto.

+0

Le parentesi angolari non devono essere sottoposte a escape nei '' ", di solito con caratteri di escape nelle stringhe come "<\/script>" o "", ecc. Inoltre, poiché quando "document.write' non funziona in XHTML? – Ryan

+0

@minitech: ti sbagli su entrambi i punti. Nell'elemento XHTML 'script' è [definito] (http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-strict.dtd_script) come' 'in DTD - vedi te stesso, è [PCDATA, non CDATA] (http://stackoverflow.com/a/918464/116546). Di solito, si usa '' invece della codifica manuale delle entità. E 'document.write' non esiste per' XMLDocument's, quindi non ha mai funzionato (http://is.gd/VymCN5) a meno che non abbiate servito XHTML in modo errato come 'text/html', istruendo il browser per trattare è come HTML. – drdaeman

+0

I browser XHTML hanno mai trattato i documenti in modo diverso dal DOM, comunque? (cioè come documento XML?) Questa è una novità per me. Ad ogni modo, "le parentesi angolari non devono essere sottoposte a escape in'