L'équivalent en JavaScript pur de $.ready() de jQuery - comment appeler une fonction lorsque la page/le DOM est prêt(e) à l'accueillir.
Bon, c’est peut-être une question idiote, mais je suis sûr qu’il y a beaucoup d’autres personnes qui posent la même question de temps en temps. Moi, je veux juste en être sûr à 100%, de toute façon. Avec jQuery, nous connaissons tous la merveilleuse fonction
$('document').ready(function(){});
Cependant, disons que je veux exécuter une fonction écrite en JavaScript standard, sans bibliothèque pour la soutenir, et que je veux lancer une fonction dès que la page est prête à la gérer. Quelle est la bonne façon d'aborder cette question ?
Je sais que je peux le faire :
window.onload="myFunction()";
...ou je peux utiliser la balise body
:
<body onload="myFunction()">
...ou je peux même essayer en bas de la page après tout, mais la balise de fin body
ou html
comme :
<script type="text/javascript">
myFunction();
</script>
Quelle est une méthode compatible avec tous les navigateurs (anciens/nouveaux) permettant de lancer une ou plusieurs fonctions à la manière de jQuery ($.ready()`) ?
La chose la plus simple à faire en l'absence d'un framework qui s'occupe de la compatibilité entre navigateurs est de placer un appel à votre code à la fin du corps. C'est plus rapide à exécuter qu'un gestionnaire
onload
parce que celui-ci attend seulement que le DOM soit prêt, et non que toutes les images soient chargées. Et cela fonctionne dans tous les navigateurs.Pour les navigateurs modernes (à partir d'IE9 et plus récent et toute version de Chrome, Firefox ou Safari), si vous voulez être en mesure d'implémenter une méthode de type jQuery
$(document).ready()
que vous pouvez appeler de n'importe où (sans vous soucier de la position du script appelant), vous pouvez simplement utiliser quelque chose comme ceci :Utilisation :
Si vous avez besoin d'une compatibilité totale entre navigateurs (y compris les anciennes versions d'IE) et que vous ne voulez pas attendre
window.onload
, vous devriez probablement regarder comment un framework comme jQuery implémente sa méthode$(document).ready()
. C'est assez complexe et dépend des capacités du navigateur.Pour vous donner une petite idée de ce que fait jQuery (qui fonctionnera partout où la balise script est placée).
S'il est supporté, il essaie le standard :
avec une solution de repli vers :
ou pour les anciennes versions d'IE, il utilise :
avec une solution de repli vers :
Et il existe des solutions de contournement dans le chemin de code d'IE que je ne comprends pas bien, mais il semble que cela ait quelque chose à voir avec les cadres.
Voici un substitut complet du
.ready()
de jQuery écrit en javascript pur :La dernière version du code est partagée publiquement sur GitHub à l'adresse https://github.com/jfriend00/docReady.
Utilisation :
Ceci a été testé dans :
Mise en oeuvre et banc d'essai : http://jsfiddle.net/jfriend00/YfD3C/
Voici un résumé de son fonctionnement :
docReady(fn, context)
.docReady(fn, context)
est appelée, vérifiez si le gestionnaire ready a déjà été lancé. Si c'est le cas, il suffit de programmer le nouveau callback pour qu'il se déclenche juste après la fin de ce thread de JS avecsetTimeout(fn, 1)
.document.addEventListener
existe, alors installez les gestionnaires d'événements en utilisant.addEventListener()
pour les deux événements"DOMContentLoaded"
et"load"
. L'événement "load" est un événement de secours pour la sécurité et ne devrait pas être nécessaire.document.addEventListener
n'existe pas, alors installez des gestionnaires d'événements en utilisant.attachEvent()
pour les événements"onreadystatechange"
et"onload"
.onreadystatechange
, vérifiez si ledocument.readyState === "complete"
et si c'est le cas, appelez une fonction pour lancer tous les handlers ready.Les gestionnaires enregistrés avec
docReady()
sont garantis d'être lancés dans l'ordre où ils ont été enregistrés.Si vous appelez
docReady(fn)
alors que le document est déjà prêt, le callback sera programmé pour s'exécuter dès que le fil d'exécution actuel sera terminé en utilisantsetTimeout(fn, 1)
. Cela permet au code appelant de toujours supposer qu'il s'agit de callbacks asynchrones qui seront appelés plus tard, même si plus tard est dès que le fil d'exécution actuel de JS se termine et cela préserve l'ordre d'appel.Votre méthode (placer le script avant la balise de fermeture du corps)
est un moyen fiable de prendre en charge les anciens et les nouveaux navigateurs.
document.ondomcontentready=function(){}
devrait faire l'affaire, mais il n'a pas une compatibilité totale avec les navigateurs.Il semble que vous devriez simplement utiliser jQuery min.