Comment détectez-vous définitivement si l'utilisateur a ou non appuyé sur le bouton Retour du navigateur?
Comment imposez-vous l'utilisation d'un bouton de retour dans la page dans une application Web d'une seule page utilisant un #URL
système?
Pourquoi diable les boutons de retour du navigateur ne déclenchent-ils pas leurs propres événements!?
Réponses:
(Remarque: selon les commentaires de Sharky, j'ai inclus du code pour détecter les espaces arrière)
J'ai donc souvent vu ces questions sur SO, et j'ai récemment rencontré le problème du contrôle de la fonctionnalité du bouton de retour moi-même. Après quelques jours de recherche de la meilleure solution pour mon application (Single-Page with Hash Navigation), j'ai trouvé un système simple, sans navigateur et sans bibliothèque pour détecter le bouton de retour.
La plupart des gens recommandent d'utiliser:
Cependant, cette fonction sera également appelée lorsqu'un utilisateur utilise un élément sur la page qui modifie le hachage d'emplacement. Pas la meilleure expérience utilisateur lorsque votre utilisateur clique et que la page recule ou avance.
Pour vous donner un aperçu général de mon système, je remplis un tableau avec des hachages précédents pendant que mon utilisateur se déplace dans l'interface. Cela ressemble à ceci:
Assez simple. Je fais cela pour assurer la prise en charge de plusieurs navigateurs, ainsi que la prise en charge des navigateurs plus anciens. Passez simplement le nouveau hachage à la fonction, et il le stockera pour vous, puis changera le hachage (qui sera ensuite mis dans l'historique du navigateur).
J'utilise également un bouton de retour dans la page qui déplace l'utilisateur entre les pages à l'aide du
lasthash
tableau. Cela ressemble à ceci:Donc, cela ramènera l'utilisateur au dernier hachage et supprimera ce dernier hachage du tableau (je n'ai pas de bouton de transfert pour le moment).
Alors. Comment puis-je détecter si un utilisateur a utilisé mon bouton de retour sur la page ou le bouton du navigateur?
Au début, j'ai regardé
window.onbeforeunload
, mais en vain - cela n'est appelé que si l'utilisateur va changer de page. Cela ne se produit pas dans une application d'une seule page utilisant la navigation par hachage.Donc, après quelques recherches supplémentaires, j'ai vu des recommandations pour essayer de définir une variable d'indicateur. Le problème avec cela dans mon cas, c'est que j'essaierais de le définir, mais comme tout est asynchrone, il ne serait pas toujours défini à temps pour l'instruction if dans le changement de hachage.
.onMouseDown
n'a pas toujours été appelé en cliquant, et l'ajouter à un onclick ne le déclencherait jamais assez rapidement.C'est à ce moment que j'ai commencé à regarder la différence entre
document
, etwindow
. Ma dernière solution a été de définir l'indicateur à l'aide dedocument.onmouseover
et de le désactiver à l'aide dedocument.onmouseleave
.Ce qui se passe, c'est que pendant que la souris de l'utilisateur se trouve à l'intérieur de la zone du document (lire: la page rendue, mais en excluant le cadre du navigateur), mon booléen est défini sur
true
. Dès que la souris quitte la zone du document, le booléen bascule versfalse
.De cette façon, je peux changer mon
window.onhashchange
pour:Vous noterez le chèque
#undefined
. En effet, s'il n'y a pas d'historique disponible dans mon tableau, il revientundefined
. J'utilise ceci pour demander à l'utilisateur s'il souhaite quitter en utilisant unwindow.onbeforeunload
événement.Donc, en bref, et pour les personnes qui n'utilisent pas nécessairement un bouton de retour dans la page ou un tableau pour stocker l'historique:
Et voila. un moyen simple en trois parties pour détecter l'utilisation du bouton de retour par rapport aux éléments de la page en ce qui concerne la navigation par hachage.
ÉDITER:
Pour vous assurer que l'utilisateur n'utilise pas de retour arrière pour déclencher l'événement de retour, vous pouvez également inclure les éléments suivants (Merci à @thetoolman sur cette question ):
la source
Vous pouvez essayer le
popstate
gestionnaire d'événements, par exemple:Remarque: Pour de meilleurs résultats, vous devez charger ce code uniquement sur des pages spécifiques où vous souhaitez implémenter la logique pour éviter tout autre problème inattendu.
L'événement popstate est déclenché chaque fois que l'entrée d'historique actuelle change (l'utilisateur navigue vers un nouvel état). Cela se produit lorsque l'utilisateur clique sur Retour / boutons vers l' avant ou lors de votre navigateur
history.back()
,history.forward()
,history.go()
les méthodes sont appelées programatically.La
event.state
propriété is de l'événement est égale à l'objet d'état historique.Pour la syntaxe jQuery, enveloppez-la (pour ajouter un écouteur pair une fois le document prêt):
Voir aussi: window.onpopstate au chargement de la page
Voir aussi les exemples sur applications à page unique et la page pushState HTML5 :
Cela devrait être compatible avec Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ et similaire.
la source
Je luttais avec cette exigence depuis un bon moment et j'ai pris certaines des solutions ci-dessus pour la mettre en œuvre. Cependant, je suis tombé sur une observation et elle semble fonctionner sur les navigateurs Chrome, Firefox et Safari + Android et iPhone
Au chargement de la page:
Faites-moi savoir si cela aide. Si je manque quelque chose, je serai heureux de comprendre.
la source
event
a de la valeur même pour le bouton avantEn javascript, le type de navigation
2
signifie que le bouton Précédent ou Suivant du navigateur est cliqué et que le navigateur prend réellement le contenu du cache.la source
Cela fonctionnera certainement (pour détecter le clic sur le bouton de retour)
la source
Regarde ça:
ça fonctionne bien...
la source
C'est la seule solution qui a fonctionné pour moi (ce n'est pas un site Web en page). Cela fonctionne avec Chrome, Firefox et Safari.
la source
La bonne réponse est déjà là pour répondre à la question. Je veux mentionner la nouvelle API JavaScript PerformanceNavigationTiming , elle remplace la performance.navigation obsolète .
Le code suivant se connectera à la console "back_forward" si l'utilisateur a atterri sur votre page en utilisant le bouton Précédent ou Suivant. Jetez un œil au tableau de compatibilité avant de l'utiliser dans votre projet.
la source
Navigateur: https://jsfiddle.net/Limitlessisa/axt1Lqoz/
Pour le contrôle mobile: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/
la source
Voici mon point de vue. L'hypothèse est que lorsque l'URL change mais qu'il n'y a pas de clic dans le
document
détecté, c'est un navigateur en arrière (oui ou en avant). Un clic des utilisateurs est réinitialisé après 2 secondes pour que cela fonctionne sur les pages qui chargent du contenu via Ajax:la source
J'ai pu utiliser certaines des réponses de ce fil et d'autres pour le faire fonctionner dans IE et Chrome / Edge. history.pushState pour moi n'était pas pris en charge dans IE11.
la source
Un composant à part entière ne peut être implémenté que si vous redéfinissez l'API (changez les méthodes de l'historique de l'objet). Je partagerai la classe qui vient d'être écrite. Testé sur Chrome et Mozilla Prise en charge uniquement HTML5 et ECMAScript5-6
la source
Le document.mouseover ne fonctionne pas pour IE et FireFox. Cependant, j'ai essayé ceci:
Cela fonctionne pour Chrome et IE et non pour FireFox. Toujours en train de faire fonctionner FireFox. Tout moyen facile de détecter le clic du bouton Précédent / Suivant du navigateur est le bienvenu, pas particulièrement dans JQuery mais aussi AngularJS ou Javascript simple.
la source
Le code ci-dessus a fonctionné pour moi. Sur les navigateurs mobiles, lorsque l'utilisateur a cliqué sur le bouton de retour, nous avons voulu restaurer l'état de la page comme lors de sa précédente visite.
la source
Je l'ai résolu en gardant une trace de l'événement d'origine qui a déclenché le
hashchange
(que ce soit un balayage, un clic ou une roue), afin que l'événement ne soit pas confondu avec un simple atterrissage sur la page, et en utilisant un indicateur supplémentaire dans chacune de mes liaisons d'événement. Le navigateur ne remettra pas le drapeau surfalse
lorsque vous appuyez sur le bouton de retour:la source
J'ai essayé les options ci-dessus mais aucune ne fonctionne pour moi. Voici la solution
Reportez-vous à ce lien http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Click-Event-Handli pour plus de détails
la source