2011-11-02 11 views
6

Tengo una aplicación web MVC 2 que usa páginas maestras. En las páginas maestras, hay varios bloques listos al igual que la de abajo dispersos por todo el archivoCómo asegurar que mi jQuery .ready se ejecuta al final

$(document).ready(function() { 
    ... 
}); 

Del mismo modo, muchos de mis puntos de vista también tienen múltiples bloques listos dispersos por todo.

Se me ha pedido que introduzca otro bloque listo en el máster que se ejecutará al final.

Mi pregunta es "¿Hay alguna manera de garantizar que este nuevo bloque listo se ejecutará por última vez?". Mi pensamiento fue que si lo pongo en la parte inferior de la página maestra eso lo haría, pero parece que no puedo convencerme de que esto es cierto.

+3

Por lo que entiendo cómo funciona, asegúrese de que sea el último en la página debería ser suficiente. –

+0

Dado que la página web está "compuesta" en el servidor según la vista Master y MVC, ¿puedo garantizar que colocar $ (document) .ready() al final del archivo maestro sea suficiente? – wcm

Respuesta

5

Este es el método de jQuery .add que se llama para empujar devolución de llamada de sus $(document).ready() 's de la lista de todas las devoluciones de llamada:

add = function(args) { 
    var i, length, elem, type, actual; 
    for (i = 0, length = args.length; i < length; i++) { 
     elem = args[ i ]; 
     type = jQuery.type(elem); 
     if (type === "array") { 
      // Inspect recursively 
      add(elem); 
     } else if (type === "function") { 
      // Add if not in unique mode and callback is not in 
      if (!flags.unique || !self.has(elem)) { 
       list.push(elem); 
      } 
     } 
    } 
} 

fuente: jQuery's callback

Por lo tanto: lo que básicamente no está empujando todo las funciones dentro de la matriz list y después de que se haya activado el evento, llámalas en el mismo orden y si tu función se ha pulsado por última vez, se llamará último.

para empujarlo fin se puede declarar que incluso en la cabeza después de incluir todos los demás archivos .js (sólo asegúrese de que no hay ningún otro $(document).ready() abajo)

+0

Dado que la página web está "compuesta" en el servidor según la vista Master y MVC, ¿puedo garantizar que colocar $ (document) .ready() al final del archivo Master sea suficiente? – wcm

+0

Por cierto, gracias por explicar y mostrar el código. – wcm

+0

@wcm Estoy bastante seguro de que puedes :) – Teneff

0

Creo que se puede hacer un pequeño truco aquí. como yo no conozco el caso exacto que debe adaptarse a su solución, sugieren que se agrega un retraso a través de

window.setTimeout(una llamada a su cuntion aquí, * tiempo de retardo en milisegundos *);

Sé que no es tan elegante, pero esto es lo que pensé, hágame saber si esto lo ayudó, gracias.

1

Aquí hay un truco que utilizo. En la página maestra, declarar

var postReadyEvents = []; 

Luego, en las páginas secundarias, cuando se tiene un poco de código que necesita para funcionar el pasado, hacer

postReadyEvents.push(function() { 
    ///your stuff - I usually use this to resize a grid or something. 
}); 

Ahora, en la página maestra $ (documento) ready(), hacer

for(var i = 0; i < postReadyEvents.length; i++) 
{ 
    postReadyEvents[i](); 
} 

Cuando tiene $ (document) ready() en ambas páginas secundarias y las páginas principales, la página niño corre primero y la página maestra se ejecuta pasado. Este enfoque le da la capacidad de controlar cuándo se ejecuta un determinado bloque de código.

Cuestiones relacionadas