Come eseguire una funzione quando la pagina è caricata?


246

Voglio eseguire una funzione quando la pagina è caricata, ma non voglio usarla nel <body>tag.

Ho uno script che viene eseguito se lo inizializzo in <body>, in questo modo:

function codeAddress() {
  // code
}
<body onLoad="codeAddress()">

Ma voglio eseguirlo senza il <body onload="codeAddress()">e ho provato molte cose, ad esempio questo:

window.onload = codeAddress;

Ma non sta funzionando.

Quindi, come posso eseguirlo quando la pagina viene caricata?


Stai correndo window.onload = codeAddressdopo aver codeAddress()definito? In tal caso, dovrebbe funzionare. Sei sicuro che non ci sia un errore altrove?
Skilldrick,

Questo non ha alcun senso. window.onload viene eseguito dopo il caricamento della pagina e tutti i javascript sono disponibili, quindi la funzione codeAddress () può essere dichiarata ovunque all'interno della pagina o file js collegati. Non deve venire prima a meno che non sia stato chiamato durante il caricamento della pagina stessa.
Jared Farrish,

@Jared Sì. Dai un'occhiata a jsfiddle.net/HZHmc . Non funziona Ma se sposti window.onload dopo la definizione: jsfiddle.net/HZHmc/1 funziona.
Skilldrick,

Una dichiarazione di funzione viene generalmente sollevata nella parte superiore dell'ambito, quindi la funzione può essere dichiarata ovunque in un ambito accessibile.
Russ Cam

4
tutti i browser più diffusi sono in grado di visualizzare errori javascript - ne ricevi uno?
Christoph,

Risposte:


354

window.onload = codeAddress;dovrebbe funzionare - ecco una demo e il codice completo:

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript">
        function codeAddress() {
            alert('ok');
        }
        window.onload = codeAddress;
        </script>
    </head>
    <body>
    
    </body>
</html>


<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript">
        function codeAddress() {
            alert('ok');
        }
        
        </script>
    </head>
    <body onload="codeAddress();">
    
    </body>
</html>


3
Come ho detto nella mia risposta, non c'è niente di sbagliato nel codice visto - il motivo per cui non funziona deve essere un errore in JS da qualche parte.
Skilldrick,

se si inserisce un paragrafo con il testo nel corpo, non verrà caricato fino a quando non si fa clic su OK.
Verde fluorescente 5

Questo gestore di eventi globali è disponibile solo in Chrome. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Devappended

177

Invece di utilizzare jQuery o window.onload, JavaScript nativo ha adottato alcune fantastiche funzioni dal rilascio di jQuery. Tutti i browser moderni ora hanno la loro funzione DOM ready senza l'uso di una libreria jQuery.

Lo consiglierei se usi Javascript nativo.

document.addEventListener('DOMContentLoaded', function() {
    alert("Ready!");
}, false);

4
(domanda noob: che cosa fa false?)
ᔕᖺᘎᕊ

7
@ ᔕᖺᘎᕊ per la proprietà 'bolle' (che non devi includere, devo solo compilare tutti i booleani per una buona abitudine). C'è anche un'altra istruzione booleana per la proprietà 'annullabile', ma non è molto utile poiché l'istruzione sopra è già non annullabile. Leggi di più qui: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Spencer,

1
Questo è quello che stavo cercando in questo momento :) Esegue quando il DOM è completo, quindi puoi manipolarlo, non quando il browser dice "pagina completamente caricata", che può richiedere alcuni secondi, sulla base di elementi esterni (come gli annunci)
Nathanyel

1
@ x-yuri "L'evento DOMContentLoaded viene generato quando il documento è stato completamente caricato e analizzato, senza attendere il completamento del caricamento di fogli di stile, immagini e sottotelai (l'evento di caricamento può essere utilizzato per rilevare una pagina completamente caricata)." - stackoverflow.com/questions/2414750/…
Spencer

1
window.onloadpuò essere impostato solo una volta. Se si desidera eseguire due funzioni con caricamento window.onload, la seconda sovrascriverà la prima.
Yay295

46

Prendendo la risposta di Darin ma stile jQuery. (So ​​che l'utente ha richiesto javascript).

violino da corsa

$(document).ready ( function(){
   alert('ok');
});​

4
La tua risposta mi ha insegnato, ma non su jQuery / javascript.
unicorn2

2
@VijayKumar questo è jQuery, non Javascript nativo quindi hai bisogno di una libreria jQuery inclusa perché funzioni
Spencer,

30

Soluzione alternativa. Preferisco questo per la brevità e la semplicità del codice.

(function () {
    alert("I am here");
})();

Questa è una funzione anonima, in cui il nome non è specificato. Quello che succede qui è che la funzione è definita ed eseguita insieme. Aggiungilo all'inizio o alla fine del corpo, a seconda che debba essere eseguito prima di caricare la pagina o subito dopo il caricamento di tutti gli elementi HTML.


1
Questo è l'unico codice che funziona con l'anteprima HTML per GitHub: htmlpreview.github.io L' altro codice, sebbene corretto, è rovinato da questa anteprima HTML.
Jason Doucette,

2
Qualcuno può spiegare in che modo è diverso dal mettere i tag di script alla fine della pagina HTML e lo scopo della funzione anonima?
Pat-Laugh,

10

window.onload = function() { ... ecc. non è un'ottima risposta.

Questo probabilmente funzionerà, ma interromperà anche qualsiasi altra funzione già collegata a quell'evento. Oppure, se un'altra funzione si aggancia a quell'evento dopo il tuo, si romperà il tuo. Quindi, puoi passare molte ore dopo a cercare di capire perché qualcosa che funzionava non lo è più.

Una risposta più solida qui:

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;
    }
}

Qualche codice che ho usato, dimentico dove l'ho trovato per dare credito all'autore.

function my_function() {
    // whatever code I want to run after page load
}
if (window.attachEvent) {window.attachEvent('onload', my_function);}
else if (window.addEventListener) {window.addEventListener('load', my_function, false);}
else {document.addEventListener('load', my_function, false);}

Spero che questo ti aiuti :)


grazie per aver fornito ulteriori informazioni onloadsull'utilizzo
CybeX il

4

Prova readystatechange

document.addEventListener('readystatechange', () => {    
  if (document.readyState == 'complete') codeAddress();
});

dove gli stati sono:

  • caricamento : il documento si sta caricando (non attivato nello snippet)
  • interattivo : il documento viene analizzato, sparato in precedenzaDOMContentLoaded
  • completo : il documento e le risorse vengono caricati, attivati ​​in precedenzawindow.onload


3

Dai un'occhiata allo script domReady che consente di eseguire l'impostazione di più funzioni quando il DOM è stato caricato. Fondamentalmente è ciò che fa Dom pronto in molte librerie JavaScript popolari, ma è leggero e può essere preso e aggiunto all'inizio del file di script esterno.

Esempio di utilizzo

// add reference to domReady script or place 
// contents of script before here

function codeAddress() {

}

domReady(codeAddress);

0

window.onload funzionerà in questo modo:

function codeAddress() {
	document.getElementById("test").innerHTML=Date();
}
window.onload = codeAddress;
<!DOCTYPE html>
<html>
<head>
	<title>learning java script</title>
	<script src="custom.js"></script>
</head>
<body>
	<p id="test"></p>
	<li>abcd</li>
</body>
</html>

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.