Aggiungo dinamicamente alcuni tag <script>
all'elemento head dopo il caricamento della pagina. Capisco che gli script siano caricati in modo asincrono, ma posso aspettarmi che vengano analizzati nell'ordine in cui vengono aggiunti?L'aggiunta dinamica di script deve essere ordinata?
Vedo il comportamento previsto in Firefox, ma non in Safari o Chrome. Guardando il documento in strumenti di sviluppo Chrome e Firebug, entrambi mostrano le seguenti -
<html>
<head>
...
<script type="text/javascript" src="A.js"></script>
<script type="text/javascript" src="B.js"></script>
</head>
...
</html>
Tuttavia guardando la vista delle risorse di caricamento, Chrome sembra di analizzare a seconda di quale viene restituito prima dal server, mentre Firebug li carica sempre in ordina che i tag dello script siano stati aggiunti, anche quando B viene restituito prima dal server.
Devo aspettarmi che Chrome/Safari analizzi i file nell'ordine specificato? Utilizzando Chrome 5.0.375.29 beta su OS X 10.6.3
EDIT (10/5/10): Quando dico parse, intendo eseguire - può vedere molti benefici di parsing aggressiva - thx rikh
EDIT (11/5/10): Ok, quindi ho messo insieme un test sulla falsariga di quello di juandopazo qui sotto. Tuttavia ho aggiunto una combinazione di cose, tra cui
- Aggiunta dell'elemento di script alla testa direttamente con javascript. (Test A -> D)
- Aggiunta dell'elemento di script alla testa usando il metodo append() di jquery. (Test E -> H)
- 'Caricamento' lo script con il metodo getScript() di jquery. (Test I -> L)
Ho anche provato tutte le combinazioni degli attributi 'asincrono' e 'rinvia' sui tag dello script.
È possibile accedere al test qui - http://dyn-script-load.appspot.com/ e visualizzare l'origine per vedere come funziona. Gli script caricati chiamano semplicemente la funzione update().
La prima cosa da notare è che solo il primo e il terzo metodo sopra funzionano in parallelo - il secondo esegue le richieste in sequenza. Si può vedere un grafico di questa qui -
Immagine 1 - Grafico di Richiesta Lifecycle
Request lifecycle Graph http://dyn-script-load.appspot.com/images/dynScriptGraph.png
E 'anche interessante il fatto che l'append jQuery() approccio anche blocchi getScript() chiama - si può vedere che nessuno di li eseguono fino a quando tutte le chiamate append() non sono complete e quindi vengono eseguite tutte in parallelo. La nota finale su questo è che il metodo jQuery append() rimuove apparentemente i tag di script dalla testa del documento dopo che sono stati eseguiti. Solo il primo metodo lascia i tag di script nel documento.
Chrome Risultati
I risultati sono che Chrome esegue sempre il primo script di restituire, a prescindere dalla prova. Questo significa che tutti i test 'falliscono', tranne il metodo jQuery append().
Immagine 2 - Chrome 5.0.375.29 beta Risultati
Chrome Results http://dyn-script-load.appspot.com/images/chromeDynScript.png
Firefox Risultati
su Firefox, tuttavia, sembra che se si usa il primo metodo, e async è falso (cioè non impostato), quindi gli script in modo affidabile l'esecuzione in ordine.
Immagine 3 - FF 3.6.3 Risultati
FF Results http://dyn-script-load.appspot.com/images/ffDynScript.png
Nota che Safari sembra dare risultati diversi nella stessa maniera come Chrome, che ha un senso.
Inoltre, ho solo un ritardo di 500 ms sullo script lento, solo per mantenere il tempo di inizio-> fine. Potrebbe essere necessario aggiornare un paio di volte per vedere che Chrome e Safari falliscono su tutto.
Mi sembra che senza un metodo per fare questo, non stiamo sfruttando la possibilità di recuperare i dati in parallelo, e non vi è alcun motivo per cui non dovremmo (come mostra Firefox).
che ho sollevato questo come un bug nei problemi cromati Registrazione - http://code.google.com/p/chromium/issues/detail? id = 46109 – hawkett