2010-10-14 23 views
30

Supongamos, tengo un archivo js que se parece a esto:orden de ejecución del documento jQuery listo

$(document).ready(function() { // first task}); 
$(document).ready(function() { // second task }); 
$(document).ready(function() { // third task }); 

Al cargar el archivo de las tareas se ejecutan en orden. No puedo entender por qué? Supongo que los métodos de devolución de llamada se disparan cuando ocurre un evento "listo". ¿Cómo se conserva el orden de ejecución? ¿Las retrollamadas consecutivas están en cola en algún lugar?

Nota: Sé que esta es una forma muy ingenua de codificación. He escrito el fragmento solo para transmitir mi punto y no escribir dicho código en mis proyectos.

+0

no voy a presentar una respuesta porque no estoy seguro, pero no añade ready un detector de eventos, y los detectores de eventos se desencadenan en orden o su ser añadido ? – EMMERICH

+1

¿Qué esperarías que sucediera? – SLaks

Respuesta

31

Sus manejadores están siendo pushed into an array (readyList) para ejecutar in order later, cuando el documentis ready.

They're queued like this:

readyList.push(fn); 

And executed when ready like this:

var fn, i = 0; 
while ((fn = readyList[ i++ ])) { 
    fn.call(document, jQuery); 
} 

Si el documento es ya listo, entonces van a ejecutar de inmediato, que todavía está en orden.

+0

@Nick: en 1.4.3 puede controlar el orden de ejecución, ¿no? – jAndy

+1

@jAndy - No se puede, aunque se puede * retrasar * la ejecución de todos los manejadores 'listos', básicamente diciendo" ¡Oye, espera, estoy creando más elementos! ". –

+0

@Nick: Ah interesante. Incluso si no puedo imaginar un caso de uso ad hoc. – jAndy

5

Las funciones que especifique están en orden agregadas a una lista. Cuando el DOM está listo, jQuery itera a través de esa lista e invoca las funciones en ese orden.

Su lista se convierte en algo así como ..

handlers = [ function(){ alert('first') }, function() { alert('second')} ]; 

A continuación, un bucle itera a través de ...

for (var i = 0, l = handlers.length; i<l; ++i) { 
    handlers.apply(document, arguments) 
} 

Y las funciones se llaman en el contexto del documento.

+0

No se manejan así, se ejecutan de una manera que 'jQuery (funcition ($) {});' funciona :) –

+0

era un pseudo ejemplo, los 'handlers' básicamente son' readyList'. –

+0

Me refería a cómo se llaman :) –

1

Esto no es lo mejor, pero dentro de $ (ventana) .load podría tener más control. después $ (document) .ready

$(window).load(fn); 
Cuestiones relacionadas