Comment détecter les événements du bouton Précédent du navigateur – multi-navigateur
P粉141911244
2023-08-23 16:23:49
<p>Comment détecter explicitement si l'utilisateur a appuyé sur le bouton Précédent du navigateur ? </p>
<p>Comment puis-je utiliser le système <code>#URL</code> pour forcer l'utilisation d'un bouton de retour sur la page dans une application Web d'une seule page ? </p>
<p>Pourquoi le bouton Précédent du navigateur ne déclenche-t-il pas son propre événement ? ? </p>
Vous pouvez essayer
popstate
gestionnaires d'événements comme :Remarque : pour de meilleurs résultats, vous ne devez charger ce code que sur la page spécifique 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 actuelle de l'historique change (l'utilisateur accède à un nouvel état). Cela se produit lorsque l'utilisateur clique sur les boutons Précédent/Suivant du navigateur ou lorsque la méthode
history.back()
、history.forward()
、history.go()
> est appelée par programme.event.state
est un attribut de l'événement, égal à l'objet d'état historique.Pour la syntaxe jQuery, enveloppez-le (ajoutez un écouteur pair une fois le document prêt) :
Voir aussi : window.onpopstate lors du chargement de la page
Voir également l'exemple de page sur Application à page unique et HTML5 PushState :
Cela devrait être compatible avec Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ et les versions similaires.
(Remarque : j'ai ajouté du code pour détecter le retour arrière en fonction des commentaires de Sharky)
Donc, je vois souvent ces questions sur SO et j'ai récemment rencontré moi-même des problèmes pour contrôler la fonctionnalité du bouton de retour. Après des jours de recherche de la meilleure solution pour mon application (page unique avec navigation hachée), j'ai mis au point un système simple, multi-navigateurs et sans bibliothèque pour détecter le bouton de retour.
La plupart des gens recommandent d'utiliser :
Cependant, cette fonction est également appelée lorsque l'utilisateur utilise un élément dans la page qui modifie le hachage de position. Ce n'est pas la meilleure expérience utilisateur lorsque l'utilisateur clique et que la page avance ou recule.
Pour vous donner un aperçu général de mon système, au fur et à mesure que l'utilisateur se déplace dans l'interface, je remplirai un tableau avec les valeurs de hachage précédentes. Cela ressemble à ceci :
Très simple. Je fais cela pour garantir la prise en charge de tous les navigateurs ainsi que la prise en charge des anciens navigateurs. Transmettez simplement la nouvelle valeur de hachage à la fonction et elle la stockera pour vous, puis modifiera la valeur de hachage (puis la placera dans l'historique du navigateur).
J'ai également profité d'un bouton de retour sur la page qui utilise un tableau
lasthash
pour déplacer l'utilisateur entre les pages. Cela ressemble à ceci :Cela ramène donc l'utilisateur au dernier hachage et supprime le dernier hachage du tableau (je n'ai pas de bouton avant maintenant).
Alors. Comment puis-je détecter si l'utilisateur a utilisé mon bouton de retour sur la page ou mon bouton de navigateur ?
Au début j'ai regardé
window.onbeforeunload
mais en vain - il n'est appelé que lorsque l'utilisateur souhaite changer de page. Cela ne se produit pas dans une application d'une seule page utilisant la navigation par hachage.Ainsi, après quelques recherches supplémentaires, j'ai vu la suggestion d'essayer de définir une variable d'indicateur. Dans mon cas, le problème était que j'essayais 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'est pas toujours appelé en click , et l'ajouter à onclick ne le déclenchera jamais assez rapidement.Depuis, j'ai commencé à faire des recherches
文档
和窗口
之间的区别。我的最终解决方案是使用document.onmouseover
设置该标志,并使用document.onmouseleave
en le désactivant.Ce qui se passe, c'est que lorsque la souris de l'utilisateur se trouve dans la zone du document (lire : la page rendue, mais pas le cadre du navigateur), mon booléen est défini sur
true
。一旦鼠标离开文档区域,布尔值就会翻转为false
.De cette façon, je peux changer
window.onhashchange
en :Vous remarquerez la vérification de
#undefined
. En effet, s'il n'y a pas d'historique disponible dans mon tableau, il renvoieundefined
. J'utilise ceci pour demander à l'utilisateur s'il souhaite quitter l'événement#undefined
的检查。这是因为如果我的数组中没有可用的历史记录,它将返回undefined
。我用它来询问用户是否想使用window.onbeforeunload
.Donc, en un mot, pour tous ceux qui n'utilisent pas nécessairement un bouton de retour dans la page ou un tableau pour stocker l'historique :
C'est ce que vous voulez. Une approche simple en trois parties pour détecter l'utilisation du bouton de retour par rapport aux éléments de la page en termes de navigation par hachage.
Éditeur :
Pour vous assurer que l'utilisateur n'utilise pas la touche retour arrière pour déclencher l'événement back, vous pouvez également inclure les éléments suivants (grâce à cette question) :