2012-06-04 12 views
23

Sto lavorando su un codebase con più blocchi di codice che impostano un comportamento su document.ready() (jQuery). C'è un modo per far rispettare quel blocco specifico che viene chiamato prima degli altri?jQuery: impone l'ordine di esecuzione delle chiamate document.ready()

Sfondo: Ho bisogno di rilevare gli errori JS in un ambiente di test automatico, quindi ho bisogno del codice che inizia a registrare gli errori JS da eseguire prima che venga eseguito qualsiasi altro codice JS.

+2

Il blocco del codice di errore è veramente * necessario * per attendere che il DOM sia pronto? –

+0

@KevinB Ottimo punto! Potrebbe anche valere la pena di non aspettare ... – msanford

+0

@KevinB Non ho molta familiarità con JS. Se inserissi il codice all'esterno di qualsiasi blocco, sarebbe garantito che fosse eseguito prima che fosse eseguito qualsiasi altro codice? –

risposta

22

document.ready() le richiamate vengono richiamate nell'ordine in cui sono state registrate. Se si registra prima il callback di prova, verrà chiamato per primo.

Anche se il codice di test in realtà non ha bisogno di manipolare il DOM, è possibile essere in grado di eseguirlo mentre il codice viene analizzato e non attendere fino a quando il DOM non è pronto, prima che vengano richiamati gli altri callback document.ready(). Oppure, potresti eseguire immediatamente parte del tuo codice di test e rinviare solo la parte che utilizza il DOM fino a document.ready().

Un'altra idea è (a scopo di test solo) è possibile eseguire con una versione leggermente modificata di jQuery che ha aggiunto un flag per document.ready() che quando passò e impostare a true indicato per chiamare tale funzione prima o si potrebbe aggiungere un nuovo metodo document.readyFirst() questo chiamerebbe prima la tua funzione. Ciò comporterebbe modifiche minori al codice di elaborazione document.ready() in jQuery.

+0

@AnkitSoni - Perché hai rimosso il tag di risposta migliore 8 mesi dopo? Cosa è cambiato? – jfriend00

+1

L'errore, l'ho riaggiunto. Al contrario, mi riferivo ancora a questo perché è ancora utile! –

0

È possibile eseguire il codice di inizio registrazione in DOMReady e altre inizializzazioni in caricamento. Oppure puoi creare il tuo gestore di inizializzazione che chiama prima il codice di inizio registrazione e poi tutte le altre callback di inizializzazione (a condizione che siano registrate con il tuo gestore e non jQuery, a meno che tu non voglia hackerare jQuery ed estrarle da lì, cosa che non faccio t consiglio).

6

Dovresti essere in grado di utilizzare holdReady per farlo. Finché è incluso prima degli eventi pronti, è possibile eseguire il proprio codice e quindi attivare gli altri eventi pronti.

7

Come @ jfriend00 contare che ready callbacks are called in the order they were registered.

Quindi, anche se questo blocco di codice ha invitato l'inizio, è possibile impostare un altro richiamata in esso così sarà eseguito su endmost.

jQuery(document).ready(function(){ 
    jQuery(document).ready(function(){ 
     // This block will be executed after all ready calls. 
    }); 
}); 
+1

Questo metodo funziona davvero, ma posso immaginare che in alcuni casi dia dei risultati piuttosto strani. Inoltre, ha odore di codice dappertutto ed è piuttosto confuso per gli sviluppatori futuri che mantengono il codice. – Edwin

+1

@Edwin, ma è una soluzione funzionante. – Dmitry

+1

Soluzione molto bella, funziona anche con jQuery 3. – ViRuSTriNiTy

0

stavo cercando di fare qualcosa di simile, mi stava caricando un gruppo di polyfills che avevano .ready() funzioni, ma ho anche avuto il mio .ready() s a pagina che avevo bisogno eseguita per prima , sebbene i polyfill siano stati caricati nell'intestazione.

Ho trovato un buon modo per aggirarlo avendo un .ready() molto presto (subito dopo i carichi jQuery) che esegue le funzioni da un array. Poiché è molto presto nel codice sorgente, viene eseguito .ready(). Più in basso nella pagina posso aggiungere funzioni all'array e, quindi, vengono eseguite prima di qualsiasi altro .ready() s.

L'ho avvolto in una funzione .beforeReady() e lo metto su GitHub come jQuery-Before-Ready per chiunque sia interessato. https://github.com/aim12340/jQuery-Before-Ready

Problemi correlati