La differenza principale è che IE esegue un elemento di script per la prima volta che viene aggiunto al childNodes di un elemento padre, indipendentemente dal fatto che l'elemento padre sia effettivamente nel documento. Gli altri browser eseguono solo lo script quando viene aggiunto a un nodo all'interno dell'albero del documento di childNodes.
di domManip
funzione (linea 524 di jQuery 1.3.2), che è chiamato da append
e altri metodi di jQuery simili, cerca di essere intelligente e chiede evalScript
per eventuali <script>
elementi che trova nella finale analizzata HTML, per eseguire l'jQuery script (eseguendo richieste AJAX se necessario per script esterni). (Gli effettivi elementi di script sono stati rimossi dai childNode analizzati per impedirne l'esecuzione al momento dell'inserimento nel documento, presumibilmente in modo che gli script vengano eseguiti una sola volta quando il contenuto che li contiene viene aggiunto in più elementi contemporaneamente.)
Tuttavia, poiché la precedente funzione clean
, durante l'analisi dell'HTML, ha aggiunto l'elemento di script a un div wrapper, IE avrà già eseguito lo script. Quindi ottieni due esecuzioni.
La cosa migliore da fare è evitare di utilizzare le funzioni domManip
come append
con stringhe HTML quando si sta facendo qualcosa con gli script.
Infatti, dimentica di inserire il contenuto in una stringa HTML serializzata e ottenere jQuery per analizzarlo; basta farlo il molto più affidabile pianura DOM modo:
var s= document.createElement('script');
s.type= 'text/javascript';
s.charset= 'UTF-8';
s.src= 'js_test2.js';
document.getElementById('some_container').appendChild(s);
(Per essere onesti, dopo aver visto il codice sorgente stomaco-ribollimento della funzione clean
, sto avendo seri dubbi su come usare jQuery HTML-corda a base di- . manipolazioni DOM per qualsiasi cosa si suppone per sistemare i bug del browser, ma l'elaborazione muto-regex mi sembra probabile che a causare tanti problemi quanti ne risolva)
inciso con questa chiamata iniziale:.
document.write(unescape("%3Cscript src='js_test1.js' type='text/javascript'%3E%3C/script%3E"));
Non hai bisogno di unes mantello qui; Non so perché così tante persone lo facciano. La sequenza </
deve essere evitata in uno script inline poiché termina il tag <script>
e se si sta eseguendo XHTML <
e &
dovrebbe essere evitato anche (o ]]>
se si utilizza un wrapper CDATA), ma c'è un modo più semplice modo di fare tutto ciò che con appena JavaScript stringhe letterali:
document.write('\x3Cscript src="js_test1.js" type="text/javascript">\x3C/script>"));
Grazie per questa risposta molto approfondita. Sono davvero tornato al modo DOM più tradizionale, e ora funziona bene. Per quanto riguarda il non escape nella chiamata iniziale: se ricordo bene ho copiato il codice che Google Analytics utilizza per includere il loro script, sotto l'ipotesi (forse falsa) che se qualcuno sa come includere in modo sicuro un javascript remoto, è il popolo GA . Grazie per il chiarimento. – stiang