Come eseguire JavaScript dopo il caricamento della pagina?


738

Sto eseguendo uno script esterno, usando un <script>interno <head>.

Ora poiché lo script viene eseguito prima che la pagina sia stata caricata, non posso accedere <body>, tra le altre cose. Vorrei eseguire alcuni JavaScript dopo che il documento è stato "caricato" (HTML completamente scaricato e in-RAM). Ci sono eventi a cui posso agganciare quando viene eseguito il mio script, che verranno attivati ​​al caricamento della pagina?

Risposte:


838

Queste soluzioni funzioneranno:

<body onload="script();">

o

document.onload = function ...

o anche

window.onload = function ...

Nota che l'ultima opzione è un modo migliore di procedere poiché è discreta ed è considerata più standard .


5
Qual è la differenza tra <body onload = "script ();"> e document.onload = function ...?
Mentoliptus,

11
@mentoliptus: document.onload=non è invadente en.wikipedia.org/wiki/Unobtrusive_JavaScript
marcgg

3
script nel codice HTML ... no no no $ (function () {code here}); <- javascript.js può essere posizionato in testa e verrà caricato dopo DOM

21
@gerdi OP non ha menzionato nulla di jQuery. Ho anche dato un'opzione discreta nella mia risposta.
marcgg,

1
document.onload non ha funzionato per me. Ho trovato questo post con lo stesso problema stackoverflow.com/questions/5135638/… . Non sembra document.onload è un'opzione.
spottedmahn,

196

Modo ragionevolmente portatile e non framework di impostare lo script per eseguire una funzione da eseguire al momento del caricamento:

if(window.attachEvent) {
    window.attachEvent('onload', yourFunctionName);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function(evt) {
            curronload(evt);
            yourFunctionName(evt);
        };
        window.onload = newonload;
    } else {
        window.onload = yourFunctionName;
    }
}

10
+1 per aver pubblicato quasi esattamente quello che dovevo inventare 6 mesi fa. Codice come questo può essere necessario se altri framework e codice su cui non si ha alcun controllo aggiungono eventi onload e si desidera farlo anche senza cancellare gli altri eventi onload. Ho incluso la mia implementazione come funzione e ha richiesto var newonload = function (evt) {curronload (evt); newOnload (EVT); } perché per qualche ragione il framework che sto usando richiede che un evento sia passato all'evento onload.
Grant Wagner,

6
Ho appena scoperto durante i test che il codice, come scritto, porta i gestori a essere lanciati in un ordine indefinito quando collegati con attachEvent (). Se l'ordine di esecuzione del gestore è importante, è possibile che si desideri lasciare fuori il ramo window.attachEvent.
Grant Wagner,

Quindi questo aggiungerà questa funzione come funzione AGGIUNTIVA per eseguire OnLoad, giusto? (piuttosto che sostituire un evento di caricamento esistente)
Clay Nichols il

@ClayNichols: corretto.
caos,


192

Tieni presente che il caricamento della pagina ha più di una fase. A proposito, questo è puro JavaScript

"DOMContentLoaded"

Questo evento viene generato quando il documento HTML iniziale è stato completamente caricato e analizzato , senza attendere il di fogli di stile, immagini e sottoframe. In questa fase è possibile ottimizzare a livello di programmazione il caricamento di immagini e CSS in base alla velocità del dispositivo dell'utente o della larghezza di banda.

Esegue dopo il caricamento di DOM (prima di img e css):

document.addEventListener("DOMContentLoaded", function(){
    //....
});

Nota: JavaScript sincrono mette in pausa l'analisi del DOM. Se desideri che il DOM venga analizzato il più rapidamente possibile dopo che l'utente ha richiesto la pagina, puoi farlo trasformare il tuo JavaScript in modo asincrono e ottimizzare il caricamento dei fogli di stile

"caricare"

Un evento molto diverso, load , dovrebbe essere usato solo per rilevare a pagina a pieno carico . È un errore incredibilmente popolare utilizzare il caricamento in cui DOMContentLoaded sarebbe molto più appropriato, quindi sii cauto.

Esce dopo che tutto è stato caricato e analizzato:

window.addEventListener("load", function(){
    // ....
});

Risorse MDN:

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

Elenco MDN di tutti gli eventi:

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


1
@Peter abbastanza sicuro che questo sia solo probabilmente meglio se si trova nella parte inferiore dei tuoi file javascript in modo che venga eseguito per ultimo
arodebaugh

Javascript mette in pausa il rendering del DOM lì per il modo migliore sarebbe quello di posizionarlo in fondo alla pagina o di caricare javascript asincrono nell'intestazione.
DevWL,

Questa è la risposta più completa. l'onload è dopo, ma all'inizio la gente non se ne rende conto.
fino al

1
Re javascript asincrono : per chiarire, ci sono due scelte per gli script che non vengono eseguiti immediatamente. Di questi, il differimento è generalmente preferibile all'asincronizzazione - poiché il differimento non interromperà l'analisi / rendering HTML - e quando viene eseguito, il DOM è garantito per essere pronto. Carica in modo efficiente JavaScript con differimento e asincrono .
ToolmakerSteve

+1 Ho provato a window.onload = ...pensare che il mio script avrebbe atteso che tutto fosse completamente scaricato prima di essere eseguito ma sembra window.onloadeffettivamente comportarsi come document.addEventListener("DOMContentLoaded", ..., mentre in window.addEventListener("load", ...realtà aspetta che tutto sia scaricato completamente. Avrei pensato che window.onloaddovrebbe essere equivalente window.addEventListener("load", ...piuttosto che document.addEventListener("DOMContentLoaded", ...?? Ho ottenuto lo stesso risultato in Chrome e FF.
domenica

121

È possibile inserire un attributo "onload" all'interno del corpo

...<body onload="myFunction()">...

O se stai usando jQuery, puoi farlo

$(document).ready(function(){ /*code here*/ }) 

or 

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

Spero che risponda alla tua domanda.

Nota che $ (window) .load verrà eseguito dopo il rendering del documento sulla tua pagina.


65

Se gli script sono caricati all'interno <head>del documento, è possibile utilizzare ildefer attributo nel tag script.

Esempio:

<script src="demo_defer.js" defer></script>

Da https://developer.mozilla.org :

differire

Questo attributo booleano è impostato per indicare a un browser che lo script deve essere eseguito dopo che il documento è stato analizzato, ma prima di avviare DOMContentLoaded.

Questo attributo non deve essere utilizzato se l'attributo src è assente (ovvero per gli script inline), in questo caso non avrebbe alcun effetto.

Per ottenere un effetto simile per gli script inseriti dinamicamente, utilizzare async = false. Gli script con l'attributo defer verranno eseguiti nell'ordine in cui compaiono nel documento.


Adoro questa soluzione, perché non è necessario alcun codice javascript, ma è necessario solo un attributo html <3
sarkiroka,

27

Ecco uno script basato sul caricamento js posticipato dopo il caricamento della pagina,

<script type="text/javascript">
  function downloadJSAtOnload() {
      var element = document.createElement("script");
      element.src = "deferredfunctions.js";
      document.body.appendChild(element);
  }

  if (window.addEventListener)
      window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
      window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

Dove lo metto?

Incolla il codice nel tuo HTML appena prima del </body>tag (nella parte inferiore del tuo file HTML).

Che cosa fa?

Questo codice dice attendere il caricamento dell'intero documento, quindi caricare il file esterno deferredfunctions.js.

Ecco un esempio del codice sopra - Defer Rendering di JS

Ho scritto questo sulla base del caricamento posticipato del concetto di google pagepage javascript e anche di questo articolo Rinvia caricamento javascript


20

Guarda l'aggancio document.onloado in jQuery $(document).load(...).


Questo evento è affidabile? (Cross browser .. IE6 + FF2 + ecc.)
TheFlash

1
Sì, si tratta di un DOM standard per browser diversi.
Daniel A. White,

16
In realtà è window.onload che è più standard, non document.onload. AFAIK
Peter Bailey,

11

Fiddle di lavoro su<body onload="myFunction()">

<!DOCTYPE html>
<html>
 <head>
  <script type="text/javascript">
   function myFunction(){
    alert("Page is loaded");
   }
  </script>
 </head>

 <body onload="myFunction()">
  <h1>Hello World!</h1>
 </body>    
</html>

10
<script type="text/javascript">
  function downloadJSAtOnload() {
   var element = document.createElement("script");
   element.src = "defer.js";
   document.body.appendChild(element);
  }
  if (window.addEventListener)
   window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
   window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>

http://www.feedthebot.com/pagespeed/defer-loading-javascript.html




7

A volte trovo su pagine più complesse che non tutti gli elementi sono stati caricati dal time window.onload viene attivato. In tal caso, aggiungere setTimeout prima che la funzione per ritardare sia un momento. Non è elegante ma è un semplice trucco che rende bene.

window.onload = function(){ doSomethingCool(); };

diventa ...

window.onload = function(){ setTimeout( function(){ doSomethingCool(); }, 1000); };

5

Basta definire <body onload="aFunction()">che verrà chiamato dopo che la pagina è stata caricata. Il tuo codice nello script è racchiuso da aFunction() { }.


4
<body onload="myFunction()">

Questo codice funziona bene.

Ma il window.onloadmetodo ha varie dipendenze. Quindi potrebbe non funzionare tutto il tempo.


3

Usando la libreria YUI (lo adoro):

YAHOO.util.Event.onDOMReady(function(){
    //your code
});

Portatile e bello! Tuttavia, se non usi YUI per altre cose (vedi il suo documento) direi che non vale la pena usarlo.

NB: per utilizzare questo codice è necessario importare 2 script

<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo/yahoo-min.js" ></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/event/event-min.js" ></script>

3

Esiste un'ottima documentazione su come rilevare se il documento è stato caricato utilizzando Javascript o Jquery.

Utilizzando Javascript nativo questo può essere ottenuto

if (document.readyState === "complete") {
 init();
 }

Questo può essere fatto anche all'interno dell'intervallo

var interval = setInterval(function() {
    if(document.readyState === 'complete') {
        clearInterval(interval);
        init();
    }    
}, 100);

Ad esempio di Mozilla

switch (document.readyState) {
  case "loading":
    // The document is still loading.
    break;
  case "interactive":
    // The document has finished loading. We can now access the DOM elements.
    var span = document.createElement("span");
    span.textContent = "A <span> element.";
    document.body.appendChild(span);
    break;
  case "complete":
    // The page is fully loaded.
    console.log("Page is loaded completely");
    break;
}

Uso di Jquery Per verificare solo se DOM è pronto

// A $( document ).ready() block.
$( document ).ready(function() {
    console.log( "ready!" );
});

Per verificare se tutte le risorse sono state caricate, utilizzare window.load

 $( window ).load(function() {
        console.log( "window loaded" );
    });

3

Usa questo codice con la libreria jQuery, funzionerebbe perfettamente.

$(window).bind("load", function() { 

  // your javascript event

});

Aggiungi una descrizione qui
Mathews Sunny

3
$(window).on("load", function(){ ... });

.ready () funziona meglio per me.

$(document).ready(function(){ ... });

.load () funzionerà, ma non attenderà il caricamento della pagina.

jQuery(window).load(function () { ... });

Non funziona per me, interrompe lo script in-line successivo. Sto anche usando jQuery 3.2.1 insieme ad altre forcelle jQuery.

Per nascondere la sovrapposizione di caricamento dei miei siti Web, utilizzo quanto segue:

<script>
$(window).on("load", function(){
$('.loading-page').delay(3000).fadeOut(250);
});
</script>

3

JavaScript

document.addEventListener('readystatechange', event => { 

    // When HTML/DOM elements are ready:
    if (event.target.readyState === "interactive") {   //does same as:  ..addEventListener("DOMContentLoaded"..
        alert("hi 1");
    }

    // When window loaded ( external resources are loaded too- `css`,`src`, etc...) 
    if (event.target.readyState === "complete") {
        alert("hi 2");
    }
});

lo stesso per jQuery:

$(document).ready(function() {   //same as: $(function() { 
     alert("hi 1");
});

$(window).load(function() {
     alert("hi 2");
});





NOTA: - Non utilizzare il markup seguente (perché sovrascrive altre dichiarazioni dello stesso tipo):

document.onreadystatechange = ...

1

Come dice Daniel, puoi usare document.onload.

I vari framework javascript (jQuery, Mootools, ecc.) Utilizzano un evento personalizzato "domready", che suppongo debba essere più efficace. Se stai sviluppando con JavaScript, ti consiglio vivamente di sfruttare un framework, aumentano notevolmente la tua produttività.


1

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

// your javascript event here

});
</script>


4
Questa risposta dipende da jquery
Chiptus,

0

Si consiglia di utilizzare l' asnycattributo per il tag dello script che aiuta a caricare gli script esterni dopo il caricamento della pagina

<script type="text/javascript" src="a.js" async></script>
<script type="text/javascript" src="b.js" async></script>

7
Secondo w3schools , Se async è presente: lo script viene eseguito in modo asincrono con il resto della pagina (lo script verrà eseguito mentre la pagina continua l'analisi) . Forse intendevi deferinvece, come menzionato @Daniel Price?
jk7,

0

usa la funzione onload di esecuzione automatica

window.onload = function (){
    /* statements */
}();   

2
È possibile ignorare altri onloadgestori utilizzando questo approccio. Invece, dovresti aggiungere listener.
Leonid Dashko,
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.