No tengo una referencia a mano, pero las etiquetas de script se procesan en orden, por lo que si coloca $(document).ready(function1)
en una etiqueta de script después de las etiquetas de script que definen function1, etc., debería ser bueno ir.
<script type='text/javascript' src='...'></script>
<script type='text/javascript' src='...'></script>
<script type='text/javascript'>
$(document).ready(function1);
</script>
Por supuesto, otra posibilidad sería asegurarse de que está utilizando sólo una etiqueta de script, en total, mediante la combinación de archivos como parte de su proceso de construcción. (A menos que esté cargando los otros desde un CDN en algún lugar). Eso también ayudará a mejorar la velocidad percibida de su página.
EDIT: me di cuenta de que en realidad no respondí tu pregunta: No creo que haya un evento de navegador cruzado que se dispare, no.Hay si trabajas lo suficiente, mira a continuación. Puede probar para los símbolos y utilizar setTimeout para reprogramar:
<script type='text/javascript'>
function fireWhenReady() {
if (typeof function1 != 'undefined') {
function1();
}
else {
setTimeout(fireWhenReady, 100);
}
}
$(document).ready(fireWhenReady);
</script>
... pero no debería tener que hacer eso si usted consigue su pedido etiqueta script correcto.
Actualización: Puede obtener notificaciones de carga de script
elementos que se agregan a la página dinámicamente si lo desea. Para conseguir el apoyo del navegador amplio, que tiene que hacer dos cosas diferentes, sino como una técnica combinada funciona esto:
function loadScript(path, callback) {
var done = false;
var scr = document.createElement('script');
scr.onload = handleLoad;
scr.onreadystatechange = handleReadyStateChange;
scr.onerror = handleError;
scr.src = path;
document.body.appendChild(scr);
function handleLoad() {
if (!done) {
done = true;
callback(path, "ok");
}
}
function handleReadyStateChange() {
var state;
if (!done) {
state = scr.readyState;
if (state === "complete") {
handleLoad();
}
}
}
function handleError() {
if (!done) {
done = true;
callback(path, "error");
}
}
}
En mi experiencia, la notificación de error (onerror
) no es fiable al 100% multi-navegador. También tenga en cuenta que algunos navegadores harán ambos mecanismos, de ahí la variable done
para evitar notificaciones duplicadas.
Gracias por su respuesta, pero para mí parece extraño de alguna manera, ¿por qué debería colocar $ (documento). Listo (...) después de la etiqueta
Cambie el orden de carga de sus scripts para que se haya definido
function1
antes de usarlo enready
devolución de llamada.Plus Siempre me pareció mejor definir la devolución de llamada
ready
como un método anónimo y luego nombrar uno.Fuente
2009-08-18 11:50:23 RaYell
Bueno, no es posible definirlo antes porque está en el archivo javascript. –
Puede incluir el archivo con la definición 'function1' primero y luego incluir otro archivo que use esa función. El punto es que no se puede simplemente agregar archivos de script en orden aleatorio. – RaYell
Cuando dicen "La parte inferior de la página" literalmente no significan el final: significan justo antes de la etiqueta de cierre
</body>
. Coloque allí sus scripts y se cargarán antes del evento DOMReady; colóquelos luego y el DOM estará listo antes de que se carguen (porque está completo cuando se analiza la etiqueta de cierre</html>
), que, como ha encontrado, no funcionará.Si se pregunta cómo sé que esto es lo que quieren decir: he trabajado en Yahoo! y ponemos nuestros scripts justo antes de la etiqueta
</body>
:-)EDITAR: también, ver T.J. Respuesta de Crowder y asegúrese de tener las cosas en el orden correcto.
Fuente
2009-08-18 12:08:36 NickFitz
Me gusta T.J.wrote: el orden es definido (al menos es secuencial cuando su navegador es aproximadamente para ejecutar cualquier JavaScript, incluso si puede descargar los scripts en paralelo de alguna manera). Sin embargo, como aparentemente tiene problemas, tal vez esté utilizando bibliotecas de JavaScript de terceros que producen 404 Not Found o timeout? Si es así, lea Best way to use Google’s hosted jQuery, but fall back to my hosted library on Google fail.
Fuente
2009-08-18 12:13:25 Arjan
Siempre realizo una llamada desde el final de los archivos de JavaScript para registrar su carga y solía funcionar perfecto para todos los navegadores.
Ejemplo: Tengo un index.htm, Js1.js y Js2.js. Agrego la función IAmReady (Id) en el encabezado index.htm y lo llamo con los parámetros 1 y 2 desde el final de los archivos, Js1 y Js2 respectivamente. La función IAmReady tendrá una lógica para ejecutar el código de arranque una vez que recibe dos llamadas (almacenando el número de llamadas en una variable estática/global) de los dos archivos js.
Fuente
2009-08-18 12:29:50 Faiz
Tome un vistazo a .load de jQuery() http://api.jquery.com/load-event/
Fuente
2012-01-03 14:37:56 DalSoft
:) Funcionalidad útil a veces –
Además de T. J @. Crowder respuesta 's, he añadido un lazo externo recursivo que permite iterar a través de todos los scripts en una matriz y luego ejecutar una función una vez que todos los scripts se cargan:
Por supuesto se puede hacer una envoltorio para deshacerse del '0' si te gusta:
Nice work @TJ Crowder - Me encogí de dolor ante el "solo agregue un par de segundos de retraso antes de ejecutar la devolución de llamada" que vi en otros hilos.
Fuente
2016-05-22 15:37:17