Ritardare uno script jquery fino a quando tutto il resto non è stato caricato


112

Ho uno script jquery che devo eseguire solo una volta che tutto il resto sulla pagina, inclusi alcuni altri javascript (su cui non ho controllo) ha finito di fare le loro cose.

Pensavo che forse ci fosse un'alternativa a $ (document) .ready ma non sono riuscito a trovarla.

Risposte:


217

Puoi avere $(document).ready()più volte in una pagina. Il codice viene eseguito nella sequenza in cui appare.

È possibile utilizzare l' $(window).load()evento per il codice poiché ciò accade dopo che la pagina è stata caricata completamente e tutto il codice nei vari $(document).ready()gestori ha terminato l'esecuzione.

$(window).load(function(){
  //your code here
});

1
posso importare script esterni usando questo metodo?
crisma

1
Certo, se lo stai già facendo all'interno di $ (document) .ready (), non sarà diverso.
Jose Basilio

7
Questa risposta mi è stata utile perché non mi rendevo conto che il codice jquery viene eseguito in sequenza
Sevenearths

1
Grazie mille! Questo ha risolto il mio problema .height () in cui non riceveva l'altezza corretta perché la pagina (apparentemente) non era ancora stata caricata.
Jon

6
In JQuery 3.0, dovresti usare la sintassi $(window).on('load', function() { });poiché $ (window) .load () è deprecato.
Alex H

13

Questo blocco di codice risolve il mio problema,

<script type="text/javascript">
  $(window).bind("load", function () {
    // Code here
  });
</script>


Come puoi eseguire una funzione jQuery per vedere se jQuery è già caricato? Funzionerà solo quando jQuery è stato caricato prima del controllo.
HelpNeeder

11

Più unità $(document).ready()verranno attivate in ordine dall'alto in basso nella pagina. L'ultimo si $(document).ready()attiverà per ultimo sulla pagina. All'interno di quest'ultimo $(document).ready(), puoi attivare un nuovo evento personalizzato da attivare dopo tutti gli altri ..

Racchiudi il tuo codice in un gestore di eventi per il nuovo evento personalizzato.

<html>
<head>
<script>
    $(document).on("my-event-afterLastDocumentReady", function () {
        // Fires LAST
    });
    $(document).ready(function() {
        // Fires FIRST
    });
    $(document).ready(function() {
        // Fires SECOND
    });
    $(document).ready(function() {
        // Fires THIRD
    });
</script>
<body>
... other code, scripts, etc....
</body>
</html>

<script>
    $(document).ready(function() {
        // Fires FOURTH
        // This event will fire after all the other $(document).ready() functions have completed.
        // Usefull when your script is at the top of the page, but you need it run last
        $(document).trigger("my-event-afterLastDocumentReady");
    });
</script>

3

Da qui :

// Add jQuery 
var GM_JQ = document.createElement('script'); 
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript'; 
document.getElementsByTagName('head')[0].appendChild(GM_JQ); 

// Check if jQuery's loaded 
function GM_wait() 
{ 
    if(typeof unsafeWindow.jQuery == 'undefined') 
    { 
        window.setTimeout(GM_wait,100); 
    } 
    else 
    { 
        $ = unsafeWindow.jQuery; 
        letsJQuery(); 
    } 
} 

GM_wait(); 

// All your GM code must be inside this function 
function letsJQuery() 
{
    // Do your jQuery stuff in here    
} 

Questo aspetterà fino a quando jQuery viene caricato per usarlo, ma puoi usare lo stesso concetto, impostando le variabili negli altri script (o controllandole se non sono il tuo script) per aspettare che vengano caricati per usarli.

Ad esempio, sul mio sito, lo uso per il caricamento JS asincrono e aspetto che finiscano prima di fare qualsiasi cosa con loro usando jQuery:

<script type="text/javascript" language="JavaScript"> 
    function js(url){
        s = document.createElement("script");
        s.type = "text/javascript";
        s.src = url;
        document.getElementsByTagName("head")[0].appendChild(s);
    }       

    js("/js/jquery-ui.js");
    js("/js/jrails.js");
    js("/js/jquery.jgrowl-min.js");
    js("/js/jquery.scrollTo-min.js");
    js("/js/jquery.corner-min.js");
    js("/js/jquery.cookie-min.js");
    js("/js/application-min.js");

    function JS_wait() {
        if (typeof $.cookie == 'undefined' || // set in jquery.cookie-min.js
            typeof getLastViewedAnchor == 'undefined' || // set in application-min.js
            typeof getLastViewedArchive == 'undefined' || // set in application-min.js 
            typeof getAntiSpamValue == 'undefined') // set in application-min.js
        { 
            window.setTimeout(JS_wait, 100); 
        }
        else 
        { 
            JS_ready(); 
        }
    }

    function JS_ready() {
        // snipped
    };

    $(document).ready(JS_wait);
</script> 

Questo attenderà solo fino al caricamento di jQuery e ignorerà altri aspetti della pagina. Non è altro che un hack per le versioni precedenti di greasemonkey che non supportano la direttiva @require.
Cheekysoft

1
Ho aggiunto il mio codice come esempio di come ho utilizzato lo stesso concetto con jQuery per attendere il caricamento dell'altro codice.
Chris Doggett,

1

Si scopre che a causa di una peculiare miscela di framework javascript che avevo bisogno di avviare lo script utilizzando un listener di eventi fornito da uno degli altri framework.


3
Felice che tu abbia trovato una soluzione ma la tua risposta non è utile per gli altri senza maggiori dettagli ...
Andrea

1

Hai provato a caricare tutte le funzioni di inizializzazione usando il $().ready, eseguendo la funzione jQuery che volevi per ultima?

Forse puoi usare setTimeout()sulla $().readyfunzione che vuoi eseguire, chiamando la funzionalità che vuoi caricare.

In alternativa, utilizzare setInterval()e controllare a intervalli per vedere se tutte le altre funzioni di caricamento sono state completate (memorizzare lo stato in una variabile booleana). Quando le condizioni sono soddisfatte, è possibile annullare l'intervallo ed eseguire la funzione di caricamento.


Non sono sicuro di cosa intendi con questo. Stai suggerendo di importare tutti gli script tramite uno script jquery e di inserire il mio script per ultimo? Se è così, come sarebbe (sono un designer di professione, quindi non usare parole grosse :))
chrism

$ (documento) .ready (function () {callLoadFunction1 (); callLoadFunction2 (); calljQueryLoadFunction ();});
Richard Clayton,

gli altri script sono tutti file esterni quindi non sono sicuro che funzionerebbe, vero?
crisma

@crism: guarda il mio secondo esempio. Prima di eseguire qualsiasi operazione, attende che vengano impostate variabili che indicano che gli altri file JS esterni sono stati caricati. Devi solo inserire il codice che vuoi eseguire per ultimo nel mio metodo JS_ready (). Fa esattamente quello che stai cercando.
Chris Doggett

2
Basta usare$(window).load(function(){...})
Ryan Taylor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.