2012-07-19 8 views
9

NOTA: l'ho modificato con ulteriori informazioni su cosa sto recuperando da terze parti.Nested document.writes e annunci di terze parti non funzionano in IE !!!! Qualche soluzione che è sicura?

In poche parole ho un compito di includere un tag annuncio JS che chiama il nostro meccanismo di server interno che poi ritenta uno script di terze parti che document.writes alla loro file esterno ... non funzionerà in IE . Qualcuno mi ha detto che document.writes nested non funzionerà in IE. Ho provato varie cose .. appendTo/writeln/rompendo il tag script/decodificando i tag script ecc., Niente sembra funzionare. Poiché questo è un po 'nuovo per me, forse sto trascurando l'ovvio.

Questo è ciò che sembra:

my html: 
<script language="JavaScript" type="text/javascript"> 
    document.write('\x3Cscript type="text/javascript" src="_some_Path_to_internal_ad_server">\x3C/script>';); 
</script> 

Quella chiamata finisce portando in un codice che assomiglia a questo: proprio come si vede, non tag di script racchiude.

tl1 = '989'; 
    tl2 = 'xnlll'; 
    document.write('<script type=\"text/javascript\" src=\"_some_Path_to_third_party.js\"><\/script>'); 

Ora, che "_some_Path_to_third_party.js" porta a qualche codice js che ha document.writes e document.writeln

sto scrivendo questo fuori dalla parte superiore della mia testa, in modo da non mi ricordo esattamente come i tag di script sono suddivisi, ma non credo che questo sia il problema. Credo che sia il nested document.writes in IE.

Ho provato varie cose e ho persino esposto la mia prima chiamata di script direttamente nella mia pagina. No document.writes - just

<script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server"> 

Nessun dado.

ma una chiamata diretta ai js esterni il lavoro fatto (togliendo la mia chiamata al mio server interno che chiama in seguito la terza convocazione parte), ala:

<script language="JavaScript" type="text/javascript" src="_some_Path_to_internal_ad_server"> 

Qualcuno ha esperienza nel trattare con qualsiasi cosa piace questo e come superarlo?

+3

Sidenote: l'attributo _language non è valido._ – undefined

+0

Nell'ultimo script che hai pubblicato, intendevi '_some_Path_to_third_party.js' giusto? – paislee

+0

Inoltre, quali versioni di IE hai testato? – paislee

risposta

6

Dato che non hai inserito abbastanza dettagli per scrivere una risposta completa al tuo problema (scrivi: "Sto scrivendo questo in cima alla mia testa, quindi non ricordo esattamente come i tag dello script sono suddivisi ") ecco quindi alcuni suggerimenti generali per iniziare invece di una soluzione diretta. Dici che sei convinto che il problema sia con troppe chiamate document.write, quindi mi concentrerò a ridurre al minimo il loro numero laddove possibile. Spero che ti permetta di risolvere il tuo problema.

virgola Extra

Nel vostro primo esempio si ha:

document.write(' ... ';); 

Rimozione il punto e virgola in più sarebbe:

document.write(' ... '); 

Che potrebbe essere la causa dei problemi? In caso contrario, continua a leggere ...

Prima di tutto alcuni principi fondamentali:

tipo di script e la lingua

<script language="JavaScript" type="text/javascript"> 

L'attributo "linguaggio" è deprecata, quindi non usarlo. Il problema con l'attributo "type" è che il tipo MIME text/javascript è obsoleto (vedi RFC4329) e application/javascript (il tipo corretto) non è supportato universalmente. In pratica ogni browser ha sempre saputo che senza "tipo" è solo JavaScript ed è per questo che consiglio di lasciarlo fuori per ogni versione di markup dove è opzionale, come HTML5. (Inoltre il tipo MIME è qualcosa che dovrebbe essere specificato dal server.) Vedi this question per maggiori informazioni. Detto questo, userò semplicemente <script> negli esempi qui sotto.

Minimizzare documento scrive

Avendo questo nel codice HTML:

<script> 
    document.write('\x3Cscript src="file.js">\x3C/script>'); 
</script> 

è esattamente equivalente a:

<script src="file.js"></script> 

Si rendono quindi senso utilizzare document.write in questo caso, se non si è costruendo il nome dello script dinamicamente in JavaScript o qualcosa del genere, ma anche in questo caso è possibile farlo senza document.write.

Se non si conosce il percorso del copione e si sta utilizzando ad es. una variabile JavaScript denominato path allora si può essere tentati di scrivere qualcosa del genere:

<script> 
    document.write('\x3Cscript src="' + path + '">\x3C/script>'); 
</script> 

Ma è possibile ottenere più o meno lo stesso risultato con qualcosa di simile a ciò che Google utilizza per Analytics:

var newScript = document.createElement('script'); 
newScript.src = path; // or newScript.src = 'file.js'; 
var firstScript = document.getElementsByTagName('script')[0]; 
firstScript.parentNode.insertBefore(newScript, firstScript); 

Or più breve, usando appendChild:

var newScript = document.createElement('script'); 
newScript.src = path; // or newScript.src = 'file.js'; 
document.body.appendChild(newScript); 

o più facile utilizzando jQuery:

$('<script />', {src: path}).appendTo('body'); 

dove path è l'URL del tuo script. O parzialmente utilizzando jQuery solo per l'inserimento nel DOM:

var newScript = document.createElement('script'); 
newScript.src = path; // or newScript.src = 'file.js'; 
$('body').append(newScript); 

Si può anche essere in grado di utilizzare jQuery.getScript:

$.getScript(path); 

Più idee

Per altre idee vedere:

Queste sono alcune cose di base che si possono fare per ridurre al minimo l'uso di document.write. Spero che questo ti possa iniziare.

Problemi correlati