Comment exécuter une fonction lorsque la page est complètement chargée?


307

J'ai besoin d'exécuter du code JavaScript lorsque la page est complètement chargée. Cela inclut des choses comme les images.

Je sais que vous pouvez vérifier si le DOM est prêt, mais je ne sais pas si c'est la même chose que lorsque la page est entièrement chargée.


7
Alors, comment vérifiez-vous si le DOM est prêt?
Mads Skjern

Réponses:


442

Ça s'appelle load. Il est venu waaaaay avant que DOM ready ne soit disponible, et DOM ready a été créé pour la raison exacte qui loadattendait les images.

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

3
donc, juste pour clarifier (si je peux), comparé à DOM ready, window.onloadest appelé quand chaque composant de page / ressource (c'est-à-dire * y compris * les images). Ai-je raison?
BreakPhreak

19
@BreakPhreak: yes :) onloadattend toutes les ressources qui font partie du document. Cela exclut, bien sûr, les requêtes créées dynamiquement qui ne font pas partie du document lui-même, par exemple, une requête AJAX.
Matchu

3
le script n'est pas complètement chargé
HD ..

Que faire si mon script peut être chargé dynamiquement et que l'événement "load" s'est produit avant d'ajouter mon gestionnaire?
pamelus

31
Une meilleure façon serait addEventListener("load", function(){})au lieu d'écraser la onloadpropriété.
user4642212

30

Habituellement, vous pouvez utiliser window.onload, mais vous remarquerez peut-être que les navigateurs récents ne se déclenchent pas window.onloadlorsque vous utilisez les boutons d'historique arrière / avant.

Certaines personnes suggèrent des contorsions étranges pour contourner ce problème, mais vraiment si vous créez un window.onunloadgestionnaire (même un qui ne fait rien), ce comportement de mise en cache sera désactivé dans tous les navigateurs. Le MDC documente assez bien cette "fonctionnalité", mais pour une raison quelconque, il y a encore des gens qui utilisent setIntervalet d'autres hacks étranges.

Certaines versions d'Opera ont un bogue qui peut être contourné en ajoutant ce qui suit quelque part dans votre page:

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

Si vous essayez simplement d'obtenir une fonction javascript appelée une fois par vue (et pas nécessairement après le chargement du DOM), vous pouvez faire quelque chose comme ceci:

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

Par exemple, j'utilise cette astuce pour précharger un très gros fichier dans le cache sur un écran de chargement:

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

Quelqu'un peut-il clarifier le fonctionnement de cette astuce ? Trop compliqué pour moi, doh ..
Razzle

20

Par souci d'exhaustivité, vous pouvez également vouloir le lier à DOMContentLoaded, qui est désormais largement pris en charge

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

Plus d'informations: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded


7
Cette réponse est exactement à l'opposé de ce qui a été demandé dans la question.
Muhammad bin Yusrat

2
En effet, l'événement DOMContentLoaded est déclenché lorsque tout le contenu DOM a été chargé, avant d'avoir chargé toutes ses dépendances. Étant donné que les utilisateurs dans le fil des réponses ont fait référence, $.readyj'ai pensé que cela apportait une bonne contribution. Btw. J'utiliserais la addEventListenerméthode -m également pour l' loadévénement, car elle vous permet d'avoir plusieurs rappels:window.addEventListener("load", function(event){ // your code here });
murb

16

Essayez-le, il s'exécute uniquement après le chargement de la page entière

Par Javascript

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

Par Jquery

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

1
$(window)me fait penser que ce serait jquery - non? Ou est-ce que la syntaxe javascript est confuse? (Je suis nouveau sur JS).
Azendale

2
pourquoi ne pas simplement l'utiliser $(document).ready();lorsque jQuery est disponible?
Andreas

le vôtre est le document (plus ou moins juste le HTML analysé), l'autre ("charger") est tout, y compris les images et les styles. Dépend de ce dont vous avez besoin.
amenthes

11

Essayez ce code

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

visitez https://developer.mozilla.org/en-US/docs/DOM/document.readyState pour plus de détails


Ouais, c'est utile. Merci beaucoup ~
Bravo Yeung

2
"interactive"n'est pas complètement chargé. "complete"est entièrement chargé
Ryan Walker

Enfin! Merci mille fois, Jacob. Toutes les nombreuses méthodes énumérées ici ayant échoué (au mieux, un radiobutton serait mis à jour et un calcul résultant pourrait être effectué, mais le bouton n'apparaîtrait pas enfoncé), votre méthode fait l'affaire.
secr

8

l'événement window.onload se déclenche lorsque tout est chargé, y compris les images, etc.

Vous voudriez vérifier l'état DOM prêt si vous vouliez que votre code js s'exécute le plus tôt possible, mais vous devez toujours accéder aux éléments DOM.


8

Javascript en utilisant l' onLoad()événement, attendra que la page soit chargée avant de s'exécuter.

<body onload="somecode();" >

Si vous utilisez la fonction prête pour le document du framework jQuery, le code se chargera dès que le DOM sera chargé et avant que le contenu de la page ne soit chargé:

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

7

Vous pouvez utiliser window.onload , car les documents indiquent qu'il n'est pas déclenché tant que le DOM n'est pas prêt et que TOUS les autres actifs de la page (images, etc.) sont chargés.


Ah génial. Eh bien, j'ai fait ça. La dernière image de la page est la suivante: <img src = "imdbupdate.php? Update = ajax" style = "display: hidden" onload = "window.location = 'movies.php? Do = admincp'" /> Cependant, il ne me réoriente pas
Ben Shelock

...quelle? Vous souhaitez rediriger une fois une image chargée?
Matchu

Je ne sais pas pourquoi vous voudriez cela, mais la raison pour laquelle il ne redirige pas est peut-être qu'il est affiché: caché, et donc le navigateur ne prend pas la peine de le charger car il ne sera pas affiché.
Matchu

c'est peut-être juste une image cachée qui fait quelque chose d'important sur le serveur, comme suivre un hit ou faire quelque chose dans la base de données?
Marc Novakowski

Je peux l'obtenir, mais le faire rediriger après n'a pas de sens pour moi. Pourquoi avoir la page si vous ne voulez pas que l'utilisateur y passe du temps? Et si l'objectif est de rediriger à la charge, pourquoi ne pas simplement utiliser un événement window.onload, car c'est une mise en œuvre plus propre dans l'ensemble?
Matchu


2

Dans les navigateurs modernes avec javascript moderne (> = 2015), vous pouvez ajouter type="module"à votre balise de script, et tout ce qui se trouve dans ce script s'exécutera après le chargement de la page entière. par exemple:

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

les navigateurs plus anciens comprendront également l' nomoduleattribut. Quelque chose comme ça:

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

Pour plus d'informations, vous pouvez visiter javascript.info .


1

Si vous avez besoin d'utiliser beaucoup d' onloadutilisation à la $(window).loadplace (jQuery):

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

1

La propriété onload du mixin GlobalEventHandlers est un gestionnaire d'événements pour l'événement de chargement d'un élément Window, XMLHttpRequest, etc., qui se déclenche lorsque la ressource est chargée.

Donc, fondamentalement, javascript a déjà une méthode onload sur la fenêtre qui s'exécute quelle page est entièrement chargée, y compris les images ...

Vous pouvez faire quelque chose:

var spinner = true;

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

-1

Mise à jour 2019: c'est la réponse qui a fonctionné pour moi. Comme j'avais besoin de plusieurs demandes ajax pour tirer et renvoyer les données en premier pour compter les éléments de la liste.

$(document).ajaxComplete(function(){
       alert("Everything is ready now!");
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.