J'ai un script qui utilise $(document).ready
, mais il n'utilise rien d'autre de jQuery. Je voudrais l'éclaircir en supprimant la dépendance jQuery.
Comment puis-je implémenter ma propre $(document).ready
fonctionnalité sans utiliser jQuery? Je sais que l'utilisation window.onload
ne sera pas la même chose, car les window.onload
incendies après le chargement de toutes les images, cadres, etc.
javascript
jquery
FlySwat
la source
la source
$(document).ready
, vous pouvez résoudre ce problème facilement en exécutant votre code tout en bas de la page plutôt qu'en haut. HTML5Boilerplate utilise cette approche exacte.Réponses:
Il existe un remplacement basé sur des normes,
DOMContentLoaded
pris en charge par plus de 98% des navigateurs , mais pas IE8:La fonction native de jQuery est beaucoup plus compliquée que simplement window.onload, comme illustré ci-dessous.
la source
Éditer:
Voici un remplacement viable pour jQuery ready
Tiré de https://plainjs.com/javascript/events/running-code-when-the-document-is-ready-15/
Une autre bonne fonction domReady ici tirée de https://stackoverflow.com/a/9899701/175071
Comme la réponse acceptée était très loin d'être complète, j'ai assemblé une fonction "prête" comme
jQuery.ready()
basée sur la source jQuery 1.6.2:Comment utiliser:
Je ne sais pas à quel point ce code est fonctionnel, mais cela a bien fonctionné avec mes tests superficiels. Cela a pris un certain temps, alors j'espère que vous et les autres en bénéficierez.
PS: je suggère de le compiler .
Ou vous pouvez utiliser http://dustindiaz.com/smallest-domready-ever :
ou la fonction native si vous avez seulement besoin de prendre en charge les nouveaux navigateurs (contrairement à jQuery ready, cela ne fonctionnera pas si vous l'ajoutez après le chargement de la page)
la source
Trois options:
script
est la dernière balise du corps, le DOM serait prêt avant l'exécution de la balise de scriptonreadystatechange
Source: MDN
DOMContentLoaded
Préoccupé par les navigateurs de l'âge de pierre: accédez au code source jQuery et utilisez la
ready
fonction. Dans ce cas, vous n'êtes pas en train d'analyser + d'exécuter toute la bibliothèque, vous n'en faites qu'une très petite partie.la source
Placez votre
<script>/*JavaScript code*/</script>
droite avant la</body>
balise de fermeture .Certes, cela pourrait ne pas convenir à tout le monde car cela nécessite de changer le fichier HTML plutôt que de simplement faire quelque chose dans le fichier JavaScript à la la
document.ready
, mais quand même ...la source
</html>
balise de fermeture ?html
balise ne doit contenir quehead
etbody
.Solution du pauvre:
Voir Fiddle
Ajout de celui-ci, un peu mieux je suppose, propre portée et non récursif
Voir Fiddle
la source
setInterval
et supprimez complètement la récursivité.J'utilise ceci:
Remarque: Cela ne fonctionne probablement qu'avec les nouveaux navigateurs, en particulier ceux-ci: http://caniuse.com/#feat=domcontentloaded
la source
Vraiment, si vous vous souciez uniquement d' Internet Explorer 9+ , ce code suffirait à remplacer
jQuery.ready
:Si vous vous inquiétez d' Internet Explorer 6 et de certains navigateurs vraiment étranges et rares, cela fonctionnera:
la source
Cette question a été posée il y a longtemps. Pour tous ceux qui viennent de voir cette question, il existe maintenant un site appelé "vous n'aurez peut-être pas besoin de jquery" qui décompose - par niveau de support IE requis - toutes les fonctionnalités de jquery et fournit des bibliothèques alternatives plus petites.
Le script prêt pour le document IE8 selon vous pourrait ne pas avoir besoin de jquery
la source
'onreadystatechange'
c'est nécessaire plutôt quedocument.attachEvent('onload', fn);
J'utilisais récemment ceci pour un site mobile. Ceci est la version simplifiée de John Resig de "Pro JavaScript Techniques". Cela dépend de addEvent.
la source
Cross-browser (anciens navigateurs aussi) et une solution simple:
Affichage d'alerte dans jsfiddle
la source
La réponse jQuery m'a été très utile. Avec un peu de réfractaire ça correspondait bien à mes besoins. J'espère que cela aide quelqu'un d'autre.
la source
removeListener
devra être appelé avec le document comme contexte, ie.removeListener.call(document, ...
Voici le plus petit extrait de code pour tester DOM ready qui fonctionne sur tous les navigateurs (même IE 8):
Voir cette réponse .
la source
Ajoutez simplement ceci au bas de votre page HTML ...
Parce que les documents HTML sont analysés de haut en bas.
la source
Cela vaut la peine de regarder dans Rock Solid addEvent () et http://www.braksator.com/how-to-make-your-own-jquery .
Voici le code en cas de panne du site
la source
Ce code inter-navigateur appellera une fonction une fois le DOM prêt:
Voici comment ça fonctionne:
domReady
appelle latoString
méthode de la fonction pour obtenir une représentation sous forme de chaîne de la fonction que vous passez et l'enveloppe dans une expression qui appelle immédiatement la fonction.domReady
crée un élément de script avec l'expression et l'ajoute aubody
document.body
après que le DOM est prêt.Par exemple, si vous procédez
domReady(function(){alert();});
comme suit:, ce qui suit sera ajouté à l'body
élément:Notez que cela ne fonctionne que pour les fonctions définies par l'utilisateur. Les éléments suivants ne fonctionneront pas:
domReady(alert);
la source
C'est l'année 2020 et la
<script>
balise a undefer
attribut.par exemple:
il spécifie que le script est exécuté lorsque la page a terminé l'analyse.
https://www.w3schools.com/tags/att_script_defer.asp
la source
Et cette solution?
la source
Il est toujours bon d'utiliser des équivalents JavaScript par rapport à jQuery. Une des raisons est qu'il faut compter sur une bibliothèque de moins et elles sont beaucoup plus rapides que les équivalents jQuery.
Une référence fantastique pour les équivalents jQuery est http://youmightnotneedjquery.com/ .
En ce qui concerne votre question, j'ai pris le code ci-dessous à partir du lien ci-dessus :) Seul bémol, cela ne fonctionne qu'avec Internet Explorer 9 et versions ultérieures.
la source
Le plus minimal et 100% fonctionnel
J'ai choisi la réponse de PlainJS et ça marche bien pour moi. Il s'étend
DOMContentLoaded
pour pouvoir être accepté sur tous les navigateurs.Cette fonction est l'équivalent de la
$(document).ready()
méthode de jQuery :Cependant, contrairement à jQuery, ce code ne fonctionnera correctement que dans les navigateurs modernes (IE> 8) et il ne le sera pas si le document est déjà rendu au moment où ce script est inséré (par exemple via Ajax). Par conséquent, nous devons étendre un peu ceci:
Cela couvre essentiellement toutes les possibilités et constitue un remplacement viable de l'aide jQuery.
la source
Nous avons trouvé une implémentation de navigateur croisée rapide et sale qui peut faire l'affaire pour la plupart des cas simples avec une implémentation minimale:
la source
doc.body
!?Les solutions setTimeout / setInterval présentées ici ne fonctionneront que dans des circonstances spécifiques.
Le problème apparaît surtout dans les anciennes versions d'Internet Explorer jusqu'à 8.
Les variables affectant le succès de ces solutions setTimeout / setInterval sont:
le code original (Javascript natif) résolvant ce problème spécifique est ici:
c'est le code à partir duquel l'équipe jQuery a construit leur implémentation.
la source
Voici ce que j'utilise, c'est rapide et couvre toutes les bases je pense; fonctionne pour tout sauf IE <9.
Cela semble attraper tous les cas:
L'événement DOMContentLoaded est disponible dans IE9 et tout le reste, donc je pense personnellement que c'est OK pour l'utiliser. Réécrivez la déclaration de la fonction flèche dans une fonction anonyme régulière si vous ne transpilez pas votre code d'ES2015 vers ES5.
Si vous voulez attendre que toutes les ressources soient chargées, toutes les images affichées, etc., utilisez plutôt window.onload.
la source
Si vous n'avez pas à prendre en charge de très anciens navigateurs, voici un moyen de le faire même lorsque votre script externe est chargé avec l' attribut async :
la source
Pour IE9 +:
la source
Si vous chargez jQuery près du bas de BODY, mais que vous rencontrez des problèmes avec le code qui écrit jQuery (<func>) ou jQuery (document) .ready (<func>), consultez jqShim sur Github.
Plutôt que de recréer sa propre fonction prête pour le document, il conserve simplement les fonctions jusqu'à ce que jQuery soit disponible, puis continue avec jQuery comme prévu. Le point de déplacer jQuery vers le bas du corps est d'accélérer le chargement des pages, et vous pouvez toujours l'accomplir en insérant le jqShim.min.js dans la tête de votre modèle.
J'ai fini par écrire ce code pour déplacer tous les scripts de WordPress dans le pied de page, et ce code shim se trouve maintenant directement dans l'en-tête.
la source
Essaye ça:
la source
onDocReady fournit un rappel lorsque le dom HTML est prêt à accéder / analyser / manipuler complètement.
onWinLoad fournit un rappel lorsque tout est chargé (images, etc.)
la source
la source
La plupart des fonctions vanilla JS Ready ne prennent PAS en compte le scénario dans lequel le
DOMContentLoaded
gestionnaire est défini une fois le document déjà chargé - ce qui signifie que la fonction ne s'exécutera jamais . Cela peut se produire si vous recherchezDOMContentLoaded
dans unasync
script externe (<script async src="file.js"></script>
).Le code ci-dessous ne vérifie
DOMContentLoaded
que si le documentreadyState
n'est pas déjàinteractive
oucomplete
.Si vous souhaitez également prendre en charge IE:
la source
J'utilise simplement:
Et contrairement
document.addEventListener("DOMContentLoaded" //etc
à la toute première réponse, cela fonctionne aussi loin que IE9 - http://caniuse.com/#search=DOMContentLoaded indique seulement aussi récemment que IE11.Fait intéressant, je suis tombé sur cette
setTimeout
solution en 2009: la vérification de l'état de préparation du DOM est-elle excessive? , qui aurait probablement pu être formulé un peu mieux, car je voulais dire "est-ce exagéré d'utiliser des approches plus complexes de divers cadres pour vérifier la disponibilité du DOM".Ma meilleure explication de la raison pour laquelle cette technique fonctionne est que, lorsque le script avec un tel setTimeout a été atteint, le DOM est en train d'être analysé, donc l'exécution du code dans le setTimeout est différée jusqu'à la fin de cette opération.
la source