2012-02-21 9 views
7

Ho notato che alcuni script sembrano essere chiamati prima di altri su una determinata pagina, mi chiedevo, qual è l'ordine specifico per gli script da caricare? In-page prima degli script .js referenziati? Stanno correndo in ordine dal primo <script> menzionato per ultimo nella pagina, o dipende dal browser? Come ci si può assicurare che uno script specifico sia il primo ad essere eseguito in una pagina?Assicurati che uno script Javascript sia il primo ad essere eseguito?

risposta

4

Ho notato che alcuni script sembrano essere chiamati prima di altri su una determinata pagina . Mi stavo chiedendo, qual è l'ordine specifico per gli script da caricare?

Questo è impostato da W3C nelle specifiche della lingua. Per lo HTML 4.01 Specification, ad esempio, è definito in Section 18.2.4 Dynamic modification of documents, item 1.

In-page prima di script js di riferimento?

Vedere sopra. No, gli script inline e collegati sono gestiti in modo identico.

Sono eseguiti in ordine dal primo citato all'ultimo nella pagina, o dipende dal browser?

Le specifiche richiedono che vengano eseguite in sequenza dall'alto verso il basso. Dovrai trovare un browser che implementa il linguaggio in base alle specifiche. Non riesco a pensare a nessuno in questo momento che gestisca i tag SCRIPT in modo diverso, ma sono sicuro che sia possibile.

Un'altra cosa da considerare è la definizione di "esecuzione". Potrebbe sembrare un parsing semantico, ma non lo è. JavaScript, come qualsiasi linguaggio di programmazione, è progettato per comportarsi secondo gli standard. JavaScript è specificato nello ECMA-262 5.1 Edition/June 2011 standard per valutare da sinistra a destra nella Sezione 7 Convenzioni lessicali. (Le terminazioni di linea vengono considerate come il carattere più a sinistra della riga successiva.) Questo documento fornisce anche convenzioni per l'ordine in cui vengono valutate le istruzioni e altre operazioni, come le istruzioni WHILE o FOR.

Come si può essere certi che uno specifico script venga eseguito per primo in una pagina?

(1) Posizionarlo in alto e (2) scegliere un browser che implementa le specifiche della lingua.

Tuttavia, ritengo che ci possa essere qualcosa di più dietro questa domanda. Se stai cercando di bloccare l'esecuzione del codice inaspettato, dovrai bloccarlo finché il gestore di eventi ONLOAD non registra che la pagina è completa. (È sufficiente racchiudere le operazioni in una funzione o racchiuderle con un IF per controllare un flag booleano, ovvero isLoaded viene impostato true da ONLOAD.) Quindi, quando il gestore di eventi ONLOAD si attiva, è possibile avviare le operazioni secondo il proprio programma senza doversi preoccupare di cose come oggetti DOM non giustificati.

9

Fintantoché nessun script viene caricato o contrassegnato in modo dinamico come asincrono o posticipato, gli script vengono eseguiti o valutati nell'ordine rilevato nella pagina. Quindi, i primi script incontrati vengono eseguiti per primi.

Un file di script referenziato esternamente che deve essere caricato farà sì che tutta l'ulteriore esecuzione di javascript attenda fino a quando quel file di riferimento esterno viene caricato ed analizzato ed eseguito.

Quindi, l'ordine di valutazione del javascript normale (non asincrono, non differito) è determinato al 100% come l'ordine in cui si trova nella pagina.

+0

Si prega di fornire un riferimento per quello da ECMA-262 edizione 5+ che dichiara che questo è il comportamento specificato secondo gli standard. Sei sicuro che funzioni in questo modo su tutti i browser e le piattaforme e non sia solo un colpo di fortuna? – ingyhere

+0

@ingyhere - Non so dove ci sia un riferimento, non ho il tempo di guardare in questo momento. Questo è il modo in cui funziona JavaScript. Se hai qualche motivo per metterlo in discussione, ti preghiamo di indicarlo. Javascript esegue dall'alto/in basso. Deve assolutamente essere coerente tra i browser o molte pagine si rompono perché le persone si affidano all'esecuzione javascript dall'alto verso il basso in ogni momento. Praticamente qualsiasi linguaggio deve offrire un ordine di esecuzione garantito tra le varie parti del codice, perché spesso è necessario per far funzionare la logica. – jfriend00

+0

Ecco un riferimento: http://docstore.mik.ua/orelly/webprog/jscript/ch12_03.htm – jfriend00

5

Per impostazione predefinita, i tag script vengono scaricati e valutati in modo sequenziale come si verificano in un documento HTML.

Tuttavia, se si utilizzano i async o defer attributi, l'esecuzione avviene sia dopo lo script termina il download (asincrona) o dopo la pagina è fatto carico (rinviare).

+0

Non contare sull'esecuzione dello stallo dell'attributo * defer * fino a dopo l'analisi (altrimenti sarebbe una buona alternativa agli eventi di carico e pronto). In HTML 4, [posticipato] (http://www.w3.org/TR/html401/interact/scripts.html#adef-defer) era solo un suggerimento che lo script non creava contenuti in modo che il browser potesse continuare a caricare durante l'esecuzione. In HTML5, [differimento] (http://www.w3.org/TR/html5/scripting-1.html#attr-script-defer) significa "attendere fino al termine dell'analisi". HTML5 non è sufficientemente ben supportato che il comportamento specificato possa essere invocato, forse non per alcuni anni ancora. – RobG

1

Gli script vengono eseguiti nell'ordine in cui vengono valutati nel file html, proprio come si leggerà dall'alto verso il basso.

Tuttavia, asincrono e posticipato possono sovrascriverlo per i browser che dispongono di quelli implementati.

Problemi correlati