2010-11-04 23 views
10

He adjuntado varias funciones en varios archivos a $ (documento) .ready y me gustaría adjuntar una sola función para que ocurra antes que ellos como la primera que $ (document) .ready se encarga o se desencadena independientemente antes del controlador $ (document) .ready.

¿Hay alguna manera de manejar el orden de las funciones que jQuery desencadena internamente como parte de jQuery.fn.ready o para enganchar una función que llama justo antes de jQuery.fn.ready.

está editando jQuery.fn.ready en un guión del partido tercero seguro hacerlo o va a causar terrible golpe en efectos en otros plugins 3 ª parte (aparte de plugins que editar jQuery.fn.ready mismos)

[ Editar]:

como ejemplo

$(document).ready(function b() {}); 
.... 
$(document).ready(function a() {/* optional setup*/}); 
.... 
$(document).ready(function c() {}); 

función que tiene que pasar una primera irrelevante de orden, pero sólo se vuelve a llamar en unas pocas páginas. No puedo garantizar el orden de byc, así que no puedo activar eventos personalizados al comienzo de byc para activar a.

Así que me gustaría una solución genérica que pueda usar para ubicar a la fuerza al inicio del readyList interno de jQuery o enganchar en la función lista de jQuery y editarla de forma segura para llamar a antes de cualquier otra función en readyList.

[más Editar]

Si es posible que preferiría no tener que rediseñar el orden de ejecución de código JavaScript o tiene que tocar cualquier otro código, aparte de función a(). Soy consciente de reestructuración permitiría que consiga evitar este problema, pero yo prefiero escribir una sola función como

$.beforeReady(function a() {}); 
+0

¿Qué vas a hacer cuando se necesita añadir un código que se ejecuta antes de la función beforeReady? ¿Agregarás un beforeBeforeReady? A veces solo necesitas morder la bala y hacer lo que hay que hacer y corregir el código para que tenga sentido. –

+0

@ Jan usted puede tener un punto válido. Aún así, prefiero crear un beforeReady que reemplaza todas las ocurrencias. Listo con .bind ("cargado") y reemplazando beforeReady con .bind ("setup") – Raynos

+0

Este problema debería solucionarse en la próxima versión de jQuery: https: // github.com/jquery/jquery/pull/80 – Mottie

Respuesta

15

Este sería un momento en el que daría lugar a un evento personalizado que todos los demás archivos haría bind a, solo tendría un controlador ready, que haría las cosas, luego activaría el evento personalizado.

Por lo tanto, en otra parte de su código, en lugar de utilizar $(document).ready, utilizaría

$(window).bind('setup', function() { 
    //code here... 
}); 

y/o

$(window).bind('loaded', function() { 
    //some other code here... 
}); 

Y en su primera y única ready manipulador, que haría algo como esto:

$(document).ready(function() { 
    $(window).trigger('setup'); 
    $(window).trigger('loaded'): 
}); 
+0

El "// hacer cosas de configuración" es opcional y solo se hace de algunas páginas. El "// código aquí" se hace en cada página. que se siente hacia atrás. No quiero incluir $ (ventana) .trigger ("algún evento personalizado") en cada página – Raynos

+0

@Raynos, puede desencadenar otro evento personalizado para hacer las cosas de configuración a continuación. –

+0

Si tengo varias funciones en el documento listo I no puedo garantizar el orden ni elegir una función para activar la configuración porque no puedo garantizar que ninguna de las funciones listas sea la primera en ser invocada por jQuery – Raynos

0

$(document).ready() o simplemente $(function(){}) es solo una implementación de .addEventListener (bueno, no exactamente, pero cerrado), lo que significa que puede agregar oyentes antes y después.

$(document).ready(listener); // goes off first. 
$(document).ready(otherListener); // goes off 2nd. 

Y así sucesivamente, no es difícil emparedar funciones. No es necesario hackear .ready() imo.

+0

Prefiero no tener que preocuparme por el orden exacto de mi código con los includes en todas partes, sino más bien establecer el orden en el código. – Raynos

+0

Hmm, quizás deberías dejar de pegar .ready() por todos lados. Usualmente uso solo un .ready() donde inicio todos mis complementos y lo guardo en un solo archivo sin nada más (juego de palabras intencionado). ;) – BGerrissen

+2

Si tuviera tiempo de editar todo el proyecto heredado para trabajar así, lo haría. Por el momento estoy estancado con una mejora gradual. – Raynos

0

Acabo de tener exactamente el mismo problema. Puse un pequeño script en GitHub que agrega una función $ .beforeReady().Divertido :)

https://github.com/aim12340/jQuery-Before-Ready

sólo tiene que cargar el guión justo después de jQuery como en este ejemplo:

<html> 
    <head> 
     <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
     <script src="jquery-before-ready.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready({ 
       alert("This function is declared first!") 
      }) 
     </script> 
     <script> 
      $.beforeReady(function(){ 
       alert("This function is declared second but executes first!") 
      }) 
     </script>   
    </body> 
</html> 
Cuestiones relacionadas