2010-06-23 26 views
7

Tengo una página de galería de fotos alojada en un CMS (Squarespace) que tiene algunos de sus propios scripts que cargan las miniaturas de forma asincrónica.Cómo ejecutar una función jQuery después de ejecutar todos y cada uno de los javascript

Las grandes imágenes reales sin embargo, no están precargados, así que decidió añadir mi propio guión en la mezcla para simplemente hacer que el navegador cargue las imágenes más grandes en la memoria caché en el fondo, como esto:

(function($) { 
    var cache = []; 
    // Arguments are image paths relative to the current page. 
    $.preLoadImages = function() { 
    var args_len = arguments.length; 
    for (var i = args_len; i--;) { 
     var cacheImage = document.createElement('img'); 
     cacheImage.src = arguments[i]; 
     cache.push(cacheImage); 
    } 
    } 
})(jQuery) 

$(window).load(function(){ 
$.preLoadImages(
    "/picture/1.jpg", 
    "/picture/2.jpg", //etc. 
    ); 
}); 

Puse mi código en $ (ventana) .load() porque este es un script de fondo y no es esencial, incluso se ejecuta, solo para mejorar el rendimiento.

Sin embargo, creo que esta secuencia de comandos bloquea de alguna manera la propia secuencia de comandos de precarga de miniaturas del CMS.

¿Estoy en lo cierto? Y lo más importante, ¿hay alguna forma de dictar que mi secuencia de comandos solo se ejecute después de que se hayan ejecutado todas las demás secuencias de comandos en la página?

aplausos

Respuesta

2

JavaScript siempre se está ejecutando, el evento hover, por ejemplo, está disparando constantemente, mousemove, etc ... no hay "fin" a la carrera de la escritura.

Sin embargo, en su caso, esto no debería bloquear ninguna otra precarga ... también puede usar document.ready aquí, ya que en realidad no necesita imágenes cargadas antes de que se ejecute su código.

En realidad, en realidad está ralentizando la página usando window.load en su lugar ... ya que la precarga comienza más tarde, cuando el navegador podría paralelizarla con otras descargas anteriores. En su lugar utilizar document.ready, así:

$(function(){ 
    $.preLoadImages(
    "/picture/1.jpg", 
    "/picture/2.jpg", //etc. 
    ); 
}); 
+0

Gracias nick. Eso tiene sentido. Sin embargo, mi script está de alguna manera bloqueando la precarga de miniaturas ... No me pongo. "No sé cómo, pero el efecto es constante y significativo. ¿Podría ser algo relacionado con los límites de las conexiones del navegador?" – andy

+0

@andy: podría ser que, si están en el mismo dominio, la especificación HTTP real dice 2 conexiones por dominio a la vez, que IE en pa rticular obedece (otros permiten la canalización más fácil). ¿Puede dar a las imágenes una URL diferente ?, por ejemplo 'http: //static.mydomain.com/Images/....', esto permitiría * otro * 'n' número de conexiones, porque lo trata como otro dominio de 'www.' por ejemplo. –

+0

hola Nick, gracias por el fragmento extra, de hecho intenté ready() primero, pero estaba obteniendo el bloque, entonces pensé que window.load() me ayudaría, pero por supuesto las miniaturas se están cargando sincronizando aquellas que no lo harían hacer una diferencia ... ¿verdad? tal vez estoy completamente equivocado, supongo que es un bloqueo porque las miniaturas solo se cargan después de que todas mis imágenes se hayan cargado en el fondo – andy

1

Scripts se cargan arriba hacia abajo, y onloads cuerpo normalmente se añaden al onloads existentes - así que mientras que $ (function() .. se encuentra al final de la página, se ejecutará el último. (último (según el comentario de nick) que significa el análisis/ejecución inicial del documento)

+0

Este es * tipo de * verdadero, en el caso de jQuery (por lo general) la mayoría del código se adjunta a un controlador 'listo', que se ejecuta más tarde, por lo que es evaluado/conectado en ese orden, el trabajo real se hace más tarde, cuando ocurre el evento 'listo'. –

+0

gracias dan. Entonces, ¿estás diciendo que no necesito el .ready() o .load()? solo llame a la función en la parte inferior de la página? – andy

+0

@andy: para el código que publicó, no hay razón para esperar, si estaba haciendo algo que necesitaba elementos DOM para estar listo, necesita 'document.ready', si no está jugando con ninguno, no es necesario . –

Cuestiones relacionadas