Pour tous les principaux navigateurs (à l'exception d'IE), l' onload
événement JavaScript ne se déclenche pas lorsque la page se charge à la suite d'une opération sur le bouton de retour - il se déclenche uniquement lorsque la page est chargée pour la première fois.
Quelqu'un peut-il m'indiquer un exemple de code multi-navigateurs (Firefox, Opera, Safari, IE,…) qui résout ce problème? Je connais l' pageshow
événement de Firefox mais malheureusement, ni Opera ni Safari ne l'implémentent.
javascript
pageload
Facture
la source
la source
Réponses:
Les gars, j'ai trouvé que JQuery n'a qu'un seul effet: la page est rechargée lorsque le bouton de retour est enfoncé. Cela n'a rien à voir avec « prêt ».
Comment cela marche-t-il? Eh bien, JQuery ajoute un écouteur d' événement onunload .
Par défaut, il ne fait rien. Mais d'une manière ou d'une autre, cela semble déclencher un rechargement dans Safari, Opera et Mozilla - quel que soit le contenu du gestionnaire d'événements.
[ modifier (Nickolay) : voici pourquoi cela fonctionne de cette façon: webkit.org , developer.mozilla.org . Veuillez lire ces articles (ou mon résumé dans une réponse distincte ci-dessous) et déterminer si vous avez vraiment besoin de le faire et ralentir le chargement de votre page pour vos utilisateurs.]
Tu ne peux pas y croire? Essaye ça:
Vous verrez des résultats similaires lors de l'utilisation de JQuery.
Vous voudrez peut-être comparer à celui-ci sans téléchargement
la source
onunload
gestionnaire (la page a déjà tout détruit; pourquoi la mettre en cache?).Certains navigateurs modernes (Firefox, Safari et Opera, mais pas Chrome) prennent en charge le cache spécial "arrière / avant" (je l'appellerai bfcache, qui est un terme inventé par Mozilla), impliqué lorsque l'utilisateur navigue en arrière. Contrairement au cache normal (HTTP), il capture l'état complet de la page (y compris l'état de JS, DOM). Cela lui permet de recharger la page plus rapidement et exactement comme l'utilisateur l'a laissée.
le
load
événement n'est pas censé se déclencher lorsque la page est chargée à partir de ce bfcache. Par exemple, si vous avez créé votre interface utilisateur dans le gestionnaire "load" et que l'événement "load" a été déclenché une fois lors du chargement initial et la deuxième fois lorsque la page a été rechargée à partir du bfcache, la page se retrouverait avec dupliquer les éléments de l'interface utilisateur.C'est aussi pourquoi l'ajout du gestionnaire "unload" arrête le stockage de la page dans le bfcache (rendant ainsi la navigation plus lente vers) - le gestionnaire de déchargement pourrait effectuer des tâches de nettoyage, ce qui pourrait laisser la page dans un état irréalisable.
Pour les pages qui ont besoin de savoir quand elles sont en cours de navigation ou de retour, Firefox 1.5+ et la version de Safari avec le correctif du bogue 28758 prennent en charge les événements spéciaux appelés «pageshow» et «pagehide».
Références:
la source
J'ai rencontré un problème que mon js ne s'exécutait pas lorsque l'utilisateur avait cliqué en arrière ou en avant. J'ai d'abord décidé d'arrêter la mise en cache du navigateur, mais cela ne semblait pas être le problème. Mon javascript a été configuré pour s'exécuter après le chargement de toutes les bibliothèques, etc. Je les ai vérifiés avec l'événement readyStateChange.
Après quelques tests, j'ai découvert que le readyState d'un élément dans une page où le retour a été cliqué n'est pas «chargé» mais «complet». Ajouter
|| element.readyState == 'complete'
à ma déclaration conditionnelle a résolu mes problèmes.Je pensais juste partager mes découvertes, j'espère qu'elles aideront quelqu'un d'autre.
Modifier pour l'exhaustivité
Mon code ressemblait à ceci:
Dans l'exemple de code ci-dessus, la variable de script était un élément de script nouvellement créé qui avait été ajouté au DOM.
la source
OK, voici une solution finale basée sur la solution initiale de ckramer et l'exemple de palehorse qui fonctionne dans tous les navigateurs, y compris Opera. Si vous définissez history.navigationMode sur `` compatible '', la fonction Ready de jQuery se déclenchera sur les opérations du bouton Retour dans Opera ainsi que sur les autres principaux navigateurs.
Cette page contient plus d'informations .
Exemple:
J'ai testé cela dans Opera 9.5, IE7, FF3 et Safari et cela fonctionne dans tous.
la source
Je n'ai pas pu faire fonctionner les exemples ci-dessus. Je voulais simplement déclencher un rafraîchissement de certaines zones div modifiées en revenant à la page via le bouton retour. L'astuce que j'ai utilisée était de définir un champ de saisie caché (appelé "bit sale") à 1 dès que les zones div changées de l'original. Le champ de saisie masqué conserve en fait sa valeur lorsque je clique en arrière, donc onload je peux vérifier ce bit. S'il est défini, j'actualise la page (ou je rafraîchis simplement les divs). Sur le chargement d'origine, cependant, le bit n'est pas défini, donc je ne perds pas de temps à charger la page deux fois.
Et cela se déclencherait correctement chaque fois que je cliquais sur le bouton de retour.
la source
Si je me souviens bien, l'ajout d'un événement unload () signifie que la page ne peut pas être mise en cache (dans le cache avant / arrière) - car son état change / peut changer lorsque l'utilisateur s'éloigne. Donc, il n'est pas sûr de restaurer l'état de dernière seconde de la page en y retournant en naviguant dans l'objet d'historique.
la source
Je pensais que ce serait pour "onunload", pas pour le chargement de la page, car ne parlons-nous pas de déclencher un événement en appuyant sur "Back"? $ document.ready () est pour les événements souhaités lors du chargement de la page, peu importe comment vous accédez à cette page (c'est-à-dire rediriger, ouvrir le navigateur directement vers l'URL, etc.), pas lorsque vous cliquez sur "Retour", sauf si vous parlez sur ce qu'il faut déclencher sur la page précédente lorsqu'il se charge à nouveau. Et je ne suis pas sûr que la page ne soit pas mise en cache car j'ai constaté que les Javascripts le sont toujours, même lorsque $ document.ready () y est inclus. Nous avons dû appuyer sur Ctrl + F5 lors de l'édition de nos scripts qui ont cet événement chaque fois que nous les révisons et nous voulons tester les résultats dans nos pages.
est ce que vous voudriez pour un événement onunload lorsque vous appuyez sur "Retour" et déchargez la page en cours, et se déclenche également lorsqu'un utilisateur ferme la fenêtre du navigateur. Cela ressemblait plus à ce qui était souhaité, même si je suis en infériorité numérique avec les réponses $ document.ready (). Fondamentalement, la différence est entre un événement qui se déclenche sur la page en cours lors de sa fermeture ou sur celui qui se charge lorsque vous cliquez sur "Retour" pendant son chargement. Testé dans IE 7 très bien, je ne peux pas parler pour les autres navigateurs car ils ne sont pas autorisés où nous sommes. Mais cela pourrait être une autre option.
la source
Je peux confirmer à ckramer que l'événement ready de jQuery fonctionne dans IE et FireFox. Voici un exemple:
la source
pour les personnes qui ne veulent pas utiliser toute la bibliothèque jquery, j'ai extrait l'implémentation dans un code séparé. Il ne fait que 0,4 Ko.
Vous pouvez trouver le code, ainsi qu'un tutoriel en allemand dans ce wiki: http://www.easy-coding.de/wiki/html-ajax-und-co/onload-event-cross-browser-kompatibler-domcontentloaded.html
la source
L' événement ready de jQuery a été créé pour ce type de problème. Vous voudrez peut-être creuser dans l'implémentation pour voir ce qui se passe sous les couvertures.
la source
ready
ne semble pas se déclencher dans Firefox, lors de l'utilisation du bouton Retour. Voir aussi la réponse de Nickolay .Bill, j'ose répondre à votre question, mais je ne suis pas sûr à 100% de mes suppositions. Je pense que d'autres navigateurs IE, lorsqu'ils amènent l'utilisateur vers une page de l'historique, chargeront non seulement la page et ses ressources à partir du cache, mais ils restaureront également l'état complet du DOM (session de lecture) pour elle. IE ne fait pas de restauration DOM (ou au bail ne l'a pas fait) et donc l'événement onload semble être nécessaire pour une réinitialisation correcte de la page.
la source
J'ai essayé la solution de Bill en utilisant $ (document) .ready ... mais au début cela n'a pas fonctionné. J'ai découvert que si le script est placé après la section html, cela ne fonctionnera pas. Si c'est la section principale, cela fonctionnera mais uniquement dans IE. Le script ne fonctionne pas dans Firefox.
la source
OK, j'ai essayé cela et cela fonctionne dans Firefox 3, Safari 3.1.1 et IE7 mais pas dans Opera 9.52.
Si vous utilisez l'exemple ci-dessous (basé sur l'exemple de palehorse), vous obtenez une boîte d'alerte lorsque la page se charge pour la première fois. Mais si vous accédez ensuite à une autre URL, puis appuyez sur le bouton Retour pour revenir à cette page, vous n'obtenez pas de boîte d'alerte dans Opera (mais vous le faites dans les autres navigateurs).
Quoi qu'il en soit, je pense que c'est assez proche pour le moment. Merci tout le monde!
la source
L'événement de déchargement ne fonctionne pas correctement sur IE 9. Je l'ai essayé avec l'événement de chargement (onload ()), il fonctionne bien sur IE 9 et FF5 .
Exemple:
la source
J'ai utilisé un modèle html. Dans le fichier custom.js de ce modèle, il y avait une fonction comme celle-ci:
Mais cette fonction ne fonctionnait pas lorsque je reviens en arrière après être allé à une autre page.
Donc, j'ai essayé ceci et cela a fonctionné:
Maintenant, j'ai 2 fonctions «prêt» mais cela ne donne aucune erreur et la page fonctionne très bien.
Néanmoins, je dois déclarer qu'il a testé sur Windows 10 - Opera v53 et Edge v42 mais pas d'autres navigateurs. Gardez à l'esprit ceci ...
Remarque: la version de jquery était 3.3.1 et la version de migration était 3.0.0
la source