2012-06-04 20 views
23

Estoy trabajando en una base de código con varios bloques de código estableciendo algún comportamiento en document.ready() (jQuery). ¿Hay alguna forma de exigir que se llame a un bloque específico antes que a los demás?jQuery: Aplicar el orden de ejecución de las llamadas a document.ready()

Antecedentes: Necesito detectar errores JS en un entorno de prueba automatizado, por lo que necesito el código que comienza a registrar errores JS para ejecutar antes de que se ejecute cualquier otro código JS.

+2

¿El bloque de código de registro de errores realmente * necesita * esperar a que el DOM esté listo? –

+0

@KevinB ¡Gran punto! Incluso puede valer la pena que no espere ... – msanford

+0

@KevinB No estoy muy familiarizado con JS. Si coloco el código fuera de cualquier bloque, ¿se garantizaría que se ejecutara antes de que se ejecutara cualquier otro código? –

Respuesta

22

document.ready() Las llamadas se llaman en el orden en que se registraron. Si registra su devolución de llamada de prueba primero, se llamará primero.

Además, si su código de prueba no necesita manipular el DOM, entonces puede ejecutarlo mientras se analiza el código y no esperar hasta que el DOM esté listo, antes de llamar a las otras document.ready(). O bien, quizás podría ejecutar parte de su código de prueba inmediatamente y diferir solo la parte que usa el DOM hasta el document.ready().

Otra idea es (para propósitos de prueba solamente) usted podría funcionar con una versión ligeramente modificada de jQuery que añade una bandera para document.ready() que cuando se pasa y se puso a true indicado para llamar a esa función primera o se podría añadir un nuevo método document.readyFirst() eso llamaría tu función primero. Esto implicaría cambios menores en el código de procesamiento document.ready() en jQuery.

+0

@AnkitSoni - ¿Por qué eliminaste la mejor etiqueta de respuesta 8 meses después? ¿Qué cambió? – jfriend00

+1

Mi error, lo he vuelto a agregar. Por el contrario, me refería a esto nuevamente, ¡ya que sigue siendo útil! –

0

Puede ejecutar el código de inicio de sesión en DOMReady y otras inicializaciones en la carga. O bien, podría crear su propio administrador de inicialización que llame primero su código de inicio de sesión y luego todas las otras devoluciones de inicialización (siempre que estén registradas con su administrador y no con jQuery, a menos que desee hackear jQuery y extraerlas de allí, lo que no hago t asesorar).

6

Debería poder usar holdReady para hacer esto. Siempre que esté incluido antes de sus eventos listos, puede ejecutar su propio código y luego activar los otros eventos listos.

7

Como @ jfriend00 mencionan que ready callbacks are called in the order they were registered.

Así que incluso si este bloque de código llamado en un principio, se puede establecer otra llamada de retorno en ella, así que va a ser ejecutado en más extrema.

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

Este método realmente funciona, pero puedo imaginarlo dando algunos resultados bastante extraños en algunos casos. Además, tiene un código que huele todo y es bastante confuso para futuros desarrolladores que mantienen el código. – Edwin

+1

@Edwin, pero es una solución funcional. – Dmitry

+1

Muy buena solución, incluso funciona en jQuery 3. – ViRuSTriNiTy

0

yo estaba tratando de hacer algo similar, yo estaba cargando un montón de polyfills que tenían ready() funciones, sino que también tenía mi propio ready() s en la página que tenía que ejecutan primero , aunque los polyfills se cargaron en el encabezado.

Encontré una buena forma de solucionarlo teniendo .ready() desde el principio (justo después de que jQuery se cargue) que ejecuta funciones desde una matriz. Como es muy temprano en el código fuente, se ejecuta .ready() primero. Más abajo en la página puedo agregar funciones a la matriz y, por lo tanto, todas se ejecutan antes que cualquier otra .ready() s.

Lo envolví en una función .beforeReady() y lo puse en GitHub como jQuery-Before-Ready para cualquiera que esté interesado. https://github.com/aim12340/jQuery-Before-Ready

Cuestiones relacionadas