Come eseguire una funzione quando la pagina è stata caricata completamente?


307

Devo eseguire un codice JavaScript quando la pagina è stata caricata completamente. Questo include cose come le immagini.

So che puoi controllare se il DOM è pronto, ma non so se è lo stesso di quando la pagina è completamente caricata.


7
Quindi, come si controlla se il DOM è pronto?
Mads Skjern,

Risposte:


442

Questo si chiama load. È arrivato waaaaay prima che DOM ready fosse in giro, e DOM ready è stato effettivamente creato per il motivo esatto che ha loadatteso sulle immagini.

window.addEventListener('load', function () {
  alert("It's loaded!")
})

3
quindi, solo per chiarire (se posso), rispetto al DOM pronto, window.onloadviene chiamato quando ogni componente / risorsa della pagina (cioè * includendo * immagini). Ho ragione?
BreakPhreak,

19
@BreakPhreak: sì :) onloadattende tutte le risorse che fanno parte del documento. Ciò esclude, ovviamente, le richieste create dinamicamente che non fanno parte del documento stesso, ad esempio una richiesta AJAX.
Matchu,

3
lo script non è stato caricato completamente
HD ..

Cosa succede se il mio script può essere caricato in modo dinamico e si verifica l'evento "load" prima di aggiungere il gestore?
pamelus,

31
Un modo migliore sarebbe addEventListener("load", function(){... })invece di sovrascrivere la onloadproprietà.
user4642212

30

Di solito è possibile utilizzare window.onload, ma è possibile notare che i browser recenti non window.onloadsi attivano quando si utilizzano i pulsanti di cronologia avanti / indietro.

Alcune persone suggeriscono strane contorsioni per aggirare questo problema, ma in realtà se si crea un window.onunloadgestore (anche uno che non fa nulla), questo comportamento di memorizzazione nella cache verrà disabilitato in tutti i browser. L' MDC documenta questa "caratteristica" abbastanza bene, ma per qualche ragione ci sono ancora persone che usano setIntervale altri strani hack.

Alcune versioni di Opera hanno un bug che può essere risolto aggiungendo quanto segue da qualche parte nella tua pagina:

<script>history.navigationMode = 'compatible';</script>

Se stai solo cercando di ottenere una funzione javascript chiamata una volta per visualizzazione (e non necessariamente dopo il completamento del caricamento del DOM), puoi fare qualcosa del genere:

<img src="javascript:location.href='javascript:yourFunction();';">

Ad esempio, utilizzo questo trucco per precaricare un file molto grande nella cache in una schermata di caricamento:

<img src="bigfile"
onload="this.location.href='javascript:location.href=\'javascript:doredir();\';';doredir();">

Qualcuno può chiarire come funziona questo trucco ? Troppo complicato per me, doh ..
Razzle

20

Per completezza, potresti anche voler associarlo a DOMContentLoaded, che ora è ampiamente supportato

document.addEventListener("DOMContentLoaded", function(event){
  // your code here
});

Maggiori informazioni: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded


7
Questa risposta è esattamente l'opposto di ciò che è stato posto nella domanda.
Muhammad bin Yusrat il

2
In effetti l'evento DOMContentLoaded viene attivato quando tutti i contenuti DOM sono stati caricati, prima che abbia caricato tutte le sue dipendenze. Dal momento che gli utenti nel thread di risposte hanno fatto riferimento, $.readyho pensato che avesse dato un buon contributo. Btw. addEventListenerUserei il metodo anche per l' loadevento, poiché ti permette di avere più callback:window.addEventListener("load", function(event){ // your code here });
murb

16

Prova questo Esegui solo dopo il caricamento dell'intera pagina

Di Javascript

window.onload = function(){
    // code goes here
};

Di Jquery

$(window).bind("load", function() {
    // code goes here
});

1
$(window)mi fa pensare che sarebbe jquery - giusto? O sto confondendo qualche sintassi javascript? (Sono nuovo di JS).
Azendale,

2
perché non usare semplicemente $(document).ready();quando jQuery è disponibile?
Andreas,

il tuo è il documento (più o meno solo il codice HTML analizzato), l'altro ("carica") è tutto compreso immagini e stili. Dipende da ciò di cui hai bisogno.
amenthes,

11

Prova questo codice

document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}

visitare https://developer.mozilla.org/en-US/docs/DOM/document.readyState per maggiori dettagli


Sì, questo è utile. Grazie mille ~
Bravo Yeung

2
"interactive"non è completamente caricato. "complete"è completamente caricato
Ryan Walker

Alla fine! Grazie mille, Jacob. Tutti i numerosi metodi elencati qui falliscono (nella migliore delle ipotesi, un pulsante di opzione verrebbe aggiornato e un calcolo risultante potrebbe essere eseguito, ma il pulsante non sembrerebbe premuto), il tuo metodo fa il trucco.
Segr

8

l'evento window.onload si attiva quando viene caricato tutto, comprese immagini, ecc.

Si desidera verificare lo stato pronto per DOM se si desidera che il codice js venga eseguito il prima possibile, ma è comunque necessario accedere agli elementi DOM.


8

Javascript utilizzando l' onLoad()evento, attenderà il caricamento della pagina prima dell'esecuzione.

<body onload="somecode();" >

Se si utilizza la funzione di documento pronto del framework jQuery, il codice verrà caricato non appena viene caricato il DOM e prima che vengano caricati i contenuti della pagina:

$(document).ready(function() {
    // jQuery code goes here
});

7

Potresti voler usare window.onload , poiché i documenti indicano che non è stato attivato fino a quando sia il DOM è pronto e TUTTI gli altri asset nella pagina (immagini, ecc.) Vengono caricati.


Ah geniale. Ben fatto. L'ultima immagine sulla pagina è questa: <img src = "imdbupdate.php? Update = ajax" style = "display: hidden" onload = "window.location = 'movies.php? Do = admincp'" /> Tuttavia non mi reindirizza
Ben Shelock il

...che cosa? Vuoi reindirizzare una volta caricata un'immagine?
Matchu,

Non sono sicuro del motivo per cui lo vorresti, ma la ragione per cui non reindirizza potrebbe essere che è display: nascosto, e quindi il browser non si preoccupa di caricarlo poiché non verrà mostrato.
Matchu,

forse è solo un'immagine nascosta che fa qualcosa di importante sul server, come rintracciare un hit o fare qualcosa nel DB?
Marc Novakowski,

Posso ottenerlo, ma averlo reindirizzare dopo non ha senso per me. Perché avere la pagina se non si desidera che l'utente vi trascorra del tempo? E se l'obiettivo è reindirizzare al caricamento, perché non usare semplicemente un evento window.onload, dal momento che si tratta di un'implementazione più pulita in generale?
Matchu,


2

Nei browser moderni con javascript moderno (> = 2015) è possibile aggiungere type="module"al tag dello script e tutto ciò che si trova all'interno di quello script verrà eseguito dopo il caricamento dell'intera pagina. per esempio:

<script type="module">
  alert("runs after") // Whole page loads before this line execute
</script>
<script>
  alert("runs before")
</script>

anche i browser più vecchi capiranno l' nomoduleattributo. Qualcosa come questo:

<script nomodule>
  alert("tuns after")
</script>

Per ulteriori informazioni è possibile visitare javascript.info .


1

Se invece devi usare molti onloadusi $(window).load(jQuery):

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

1

La proprietà onload del mixin GlobalEventHandlers è un gestore eventi per l'evento load di un oggetto Window, XMLHttpRequest, elemento, ecc., Che viene generato quando la risorsa è stata caricata.

Quindi praticamente javascript ha già il metodo onload sulla finestra che viene eseguita quale pagina è stata caricata completamente, comprese le immagini ...

Puoi fare qualcosa:

var spinner = true;

window.onload = function() {
  //whatever you like to do now, for example hide the spinner in this case
  spinner = false;
};

-1

Aggiornamento 2019: questa è stata la risposta che ha funzionato per me. Poiché avevo bisogno di più richieste Ajax per attivare e restituire i dati prima di contare le voci dell'elenco.

$(document).ajaxComplete(function(){
       alert("Everything is ready now!");
});
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.