2010-06-23 14 views
7

Ho una pagina di galleria fotografica ospitata su un CMS (Squarespace) che ha alcuni dei propri script che caricano le anteprime in modo asincrono.Come eseguire una funzione jQuery dopo tutto e qualsiasi altro javascript è stato eseguito

Le immagini di grandi dimensioni attuali, tuttavia, non sono precaricate, così ho deciso di aggiungere il mio script proprio nel mix di fare solo caricare il browser quelle immagini più grandi nella cache in background, in questo modo:

(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. 
    ); 
}); 

Ho inserito il mio codice in $ (window) .load() perché si tratta di uno script in background e non è essenziale nemmeno funzionare, è solo per migliorare le prestazioni.

Tuttavia, penso che questo script stia in qualche modo bloccando lo script di precaricamento della miniatura del CMS.

Ho ragione? E, soprattutto, c'è un modo per imporre che il mio script venga eseguito solo dopo che tutti gli altri script sulla pagina sono stati eseguiti?

applausi

risposta

2

JavaScript è sempre in funzione, l'evento hover ad esempio è sparare continuamente, mousemove, ecc ... non c'è "fine" alla corsa script.

Tuttavia, nel tuo caso, questo non dovrebbe bloccare nessun altro preloading ... anche tu puoi usare document.ready qui, dato che in realtà non hai bisogno di immagini caricate prima dell'esecuzione del codice.

Infatti, in realtà stai rallentando la pagina utilizzando window.load invece ... poiché il precaricamento inizia più tardi, quando potrebbe essere parallelizzato con altri download in precedenza dal browser. Invece utilizzare document.ready, in questo modo:

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

grazie nick. ha senso, tuttavia il mio script blocca in qualche modo il caricamento preliminare della miniatura ... Non so come, ma l'effetto è consistente e significativo. Potrebbe essere qualcosa a che fare con i limiti delle connessioni del browser ...? – andy

+0

@andy - Potrebbe, se sono nello stesso dominio, la specifica HTTP effettiva dice 2 connessioni per dominio alla volta, che IE in pa obbiettivi rticolari (altri consentono una pipeline più semplice). Può dare alle immagini un URL diverso ?, ad esempio 'http: //static.mydomain.com/Images/....', questo consentirebbe * un altro * 'n' numero di connessioni, perché lo considera come un altro dominio da 'www.', per esempio. –

+0

hey Nick, grazie per il frammento extra, in realtà ho provato ready() prima, ma ho ottenuto il blocco, quindi ho pensato che window.load() sarebbe stato d'aiuto, ma ovviamente le miniature sono state caricate asincrone quelle che non lo sarebbero state fare la differenza ... giusto? forse ho torto completamente, presumo che sia un blocco perché le miniature si caricano solo dopo che tutte le mie immagini sono state caricate in background – andy

1

Gli script vengono caricati dall'alto verso il basso, e onloads corpo sono normalmente aggiunti alla onloads esistenti - così fintanto che $ (function() .. è alla fine della pagina, (ultimo (come per il commento di Nick) che indica l'analisi/esecuzione iniziale del documento)

+0

Questo è * tipo di * true, nel caso di jQuery (di solito) la maggior parte del codice è associata a un gestore 'ready', che viene eseguito successivamente, quindi mentre è valutato/collegato in questo ordine, il lavoro effettivo viene svolto in un secondo momento, quando si verifica l'evento "pronto". –

+0

grazie dan. Quindi, stai dicendo che non ho bisogno di .ready() o .load()? basta chiamare la funzione in fondo alla pagina? – andy

+0

@andy - Per il codice che hai postato, non c'è motivo di aspettare per entrambi, se stavi facendo qualcosa che aveva bisogno di elementi DOM per essere pronto, hai bisogno di 'document.ready', se non ne hai bisogno, non serve . –

Problemi correlati