Wie erkennen Sie definitiv, ob der Benutzer die Zurück-Taste im Browser gedrückt hat oder nicht?
Wie erzwingen Sie die Verwendung einer In-Page-Zurück-Schaltfläche in einer einseitigen Webanwendung mithilfe eines #URL
Systems?
Warum um alles in der Welt lösen Browser-Zurück-Schaltflächen keine eigenen Ereignisse aus?
Antworten:
(Hinweis: Gemäß Sharkys Feedback habe ich Code zum Erkennen von Backspaces eingefügt.)
Daher habe ich diese Fragen in SO häufig gesehen und bin kürzlich auf das Problem gestoßen, die Funktionalität von Zurück-Schaltflächen selbst zu steuern. Nach einigen Tagen der Suche nach der besten Lösung für meine Anwendung (Single-Page mit Hash-Navigation) habe ich ein einfaches, browserübergreifendes, bibliotheksloses System zur Erkennung der Zurück-Schaltfläche entwickelt.
Die meisten Leute empfehlen:
Diese Funktion wird jedoch auch aufgerufen, wenn ein Benutzer ein In-Page-Element verwendet, das den Standort-Hash ändert. Nicht die beste Benutzererfahrung, wenn Ihr Benutzer klickt und die Seite vorwärts oder rückwärts geht.
Um Ihnen einen allgemeinen Überblick über mein System zu geben, fülle ich ein Array mit vorherigen Hashes, während sich mein Benutzer durch die Benutzeroberfläche bewegt. Es sieht ungefähr so aus:
Ziemlich einfach. Ich mache dies, um die browserübergreifende Unterstützung sowie die Unterstützung älterer Browser sicherzustellen. Übergeben Sie einfach den neuen Hash an die Funktion, und er speichert ihn für Sie und ändert dann den Hash (der dann in den Verlauf des Browsers aufgenommen wird).
Ich verwende auch eine Schaltfläche zum Zurückseiten innerhalb der Seite, mit der der Benutzer mithilfe des
lasthash
Arrays zwischen den Seiten verschoben wird. Es sieht aus wie das:Dadurch wird der Benutzer zurück zum letzten Hash verschoben und dieser letzte Hash aus dem Array entfernt (ich habe derzeit keine Schaltfläche zum Weiterleiten).
So. Wie erkenne ich, ob ein Benutzer meine In-Page-Zurück-Schaltfläche oder die Browser-Schaltfläche verwendet hat?
Zuerst habe ich mir das angeschaut
window.onbeforeunload
, aber ohne Erfolg - das wird nur aufgerufen, wenn der Benutzer die Seiten wechseln will. Dies ist in einer Einzelseitenanwendung mit Hash-Navigation nicht der Fall.Nach einigem Graben sah ich Empfehlungen für den Versuch, eine Flag-Variable zu setzen. Das Problem dabei ist in meinem Fall, dass ich versuchen würde, es festzulegen, aber da alles asynchron ist, würde es nicht immer rechtzeitig für die if-Anweisung in der Hash-Änderung festgelegt.
.onMouseDown
wurde nicht immer mit einem Klick aufgerufen, und das Hinzufügen zu einem Onclick würde es niemals schnell genug auslösen.Zu diesem Zeitpunkt begann ich, den Unterschied zwischen
document
und zu untersuchenwindow
. Meine endgültige Lösung bestand darin, das Flag mit zu setzendocument.onmouseover
und es mit zu deaktivierendocument.onmouseleave
.Während sich die Maus des Benutzers im Dokumentbereich befindet (lesen: die gerenderte Seite, jedoch ohne den Browser-Frame), wird mein Boolescher Wert auf gesetzt
true
. Sobald die Maus den Dokumentbereich verlässt, wechselt der Boolesche Wert zufalse
.Auf diese Weise kann ich meine ändern
window.onhashchange
zu:Sie werden den Scheck für notieren
#undefined
. Dies liegt daran, dass wenn in meinem Array kein Verlauf verfügbar ist, dieser zurückgegeben wirdundefined
. Ich benutze dies, um den Benutzer zu fragen, ob er mit einemwindow.onbeforeunload
Ereignis gehen möchte .Kurz gesagt und für Personen, die nicht unbedingt eine In-Page-Zurück-Schaltfläche oder ein Array zum Speichern des Verlaufs verwenden:
Und da hast du es. Eine einfache dreiteilige Methode zur Erkennung der Verwendung von Zurück-Schaltflächen im Vergleich zu In-Page-Elementen in Bezug auf die Hash-Navigation.
BEARBEITEN:
Um sicherzustellen, dass der Benutzer keine Rücktaste verwendet, um das Rückereignis auszulösen, können Sie auch Folgendes einschließen (Dank an @thetoolman für diese Frage ):
quelle
Sie können den
popstate
Event-Handler ausprobieren , z.Hinweis: Um die besten Ergebnisse zu erzielen, sollten Sie diesen Code nur auf bestimmten Seiten laden, auf denen Sie die Logik implementieren möchten, um andere unerwartete Probleme zu vermeiden.
Das Popstate-Ereignis wird jedes Mal ausgelöst, wenn sich der aktuelle Verlaufseintrag ändert (Benutzer navigiert zu einem neuen Status). Das passiert , wenn der Benutzer klickt auf dem Browser Back / Forward - Tasten oder wenn
history.back()
,history.forward()
,history.go()
werden Methoden programmatisch genannt.Die
event.state
is-Eigenschaft des Ereignisses entspricht dem Verlaufsstatusobjekt.Umschließen Sie die jQuery-Syntax (um einen Listener hinzuzufügen, nachdem das Dokument fertig ist):
Siehe auch: window.onpopstate beim Laden der Seite
Siehe auch die Beispiele für Single-Page-Apps und die HTML5-PushState- Seite:
Dies sollte mit Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ und ähnlichem kompatibel sein.
quelle
Ich hatte eine ganze Weile mit dieser Anforderung zu kämpfen und einige der oben genannten Lösungen gewählt, um sie umzusetzen. Ich bin jedoch auf eine Beobachtung gestoßen, die anscheinend in allen Browsern von Chrome, Firefox und Safari + Android und iPhone funktioniert
Laden auf der Seite:
Lassen Sie mich wissen, ob das hilft. Wenn etwas fehlt, werde ich gerne verstehen.
quelle
event
hat sogar Wert für den VorwärtsknopfIn Javascript
2
bedeutet Navigationstyp, dass auf die Schaltfläche "Zurück" oder "Vorwärts" des Browsers geklickt wird und der Browser tatsächlich Inhalte aus dem Cache entnimmt.quelle
Dies wird definitiv funktionieren (zum Erkennen des Zurück-Button-Klicks)
quelle
Sieh dir das an:
es funktioniert gut...
quelle
Dies ist die einzige Lösung, die für mich funktioniert hat (es ist keine einseitige Website). Es funktioniert mit Chrome, Firefox und Safari.
quelle
Die richtige Antwort ist bereits vorhanden, um die Frage zu beantworten. Ich möchte die neue JavaScript-API PerformanceNavigationTiming erwähnen , die veraltete performance.navigation ersetzt .
Der folgende Code meldet sich in der Konsole "back_forward" an, wenn der Benutzer mit der Schaltfläche "Zurück" oder "Vorwärts" auf Ihrer Seite gelandet ist. Sehen Sie sich die Kompatibilitätstabelle an, bevor Sie sie in Ihrem Projekt verwenden.
quelle
Browser: https://jsfiddle.net/Limitlessisa/axt1Lqoz/
Für die mobile Steuerung: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/
quelle
Hier ist meine Meinung dazu. Die Annahme ist, wenn sich die URL ändert, aber kein Klick innerhalb des
document
Erkannten vorhanden ist, handelt es sich um einen Browser zurück (ja oder vorwärts). Ein Benutzerklick wird nach 2 Sekunden zurückgesetzt, damit dies auf Seiten funktioniert, die Inhalte über Ajax laden:quelle
Ich konnte einige der Antworten in diesem Thread und andere verwenden, um es in IE und Chrome / Edge zum Laufen zu bringen. history.pushState wurde für mich in IE11 nicht unterstützt.
quelle
Eine vollwertige Komponente kann nur implementiert werden, wenn Sie die API neu definieren (die Methoden des Objekts 'Verlauf' ändern). Ich werde die gerade geschriebene Klasse freigeben. Getestet auf Chrome und Mozilla Unterstützung nur HTML5 und ECMAScript5-6
quelle
Der document.mouseover funktioniert nicht für IE und FireFox. Ich habe es jedoch versucht:
Dies funktioniert für Chrome und IE und nicht für FireFox. Ich arbeite immer noch daran, FireFox richtig zu machen. Jede einfache Methode zum Erkennen des Zurück- / Vorwärtsklickens des Browsers ist willkommen, insbesondere in JQuery, aber auch in AngularJS oder einfachem Javascript.
quelle
Der obige Code hat bei mir funktioniert. Wenn der Benutzer in mobilen Browsern auf die Schaltfläche "Zurück" klickte, wollten wir den Seitenstatus gemäß seinem vorherigen Besuch wiederherstellen.
quelle
Ich habe es gelöst, indem ich das ursprüngliche Ereignis verfolgt habe, das das ausgelöst hat
hashchange
(sei es ein Wischen, ein Klicken oder ein Rad), damit das Ereignis nicht mit einer einfachen Landung auf der Seite verwechselt wird, und ein zusätzliches Flag in verwendet habe jede meiner Ereignisbindungen. Der Browser setzt das Flag nicht erneut auf,false
wenn Sie auf die Schaltfläche "Zurück" klicken:quelle
Ich habe die oben genannten Optionen ausprobiert, aber keine davon funktioniert für mich. Hier ist die Lösung
Weitere Informationen finden Sie unter diesem Link http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Click-Event-Handli
quelle