¿Cómo detectas definitivamente si el usuario ha presionado o no el botón Atrás en el navegador?
¿Cómo se impone el uso de un botón de retroceso en la página dentro de una aplicación web de una sola página utilizando un #URL
sistema?
¿Por qué demonios los botones de retroceso del navegador no activan sus propios eventos?
Respuestas:
(Nota: según los comentarios de Sharky, he incluido un código para detectar espacios en blanco)
Entonces, he visto estas preguntas con frecuencia en SO, y recientemente me he encontrado con el problema de controlar la funcionalidad del botón de retroceso. Después de unos días de buscar la mejor solución para mi aplicación (Single-Page with Hash Navigation), he encontrado un sistema simple, sin navegador, sin biblioteca para detectar el botón de retroceso.
La mayoría de las personas recomiendan usar:
Sin embargo, esta función también se llamará cuando un usuario use un elemento in-page que cambie el hash de ubicación. No es la mejor experiencia de usuario cuando su usuario hace clic y la página va hacia atrás o hacia adelante.
Para darle un resumen general de mi sistema, estoy completando una matriz con hashes anteriores a medida que mi usuario se mueve a través de la interfaz. Se parece a esto:
Muy claro. Hago esto para garantizar la compatibilidad entre navegadores, así como la compatibilidad con navegadores antiguos. Simplemente pase el nuevo hash a la función, y lo almacenará para usted y luego cambiará el hash (que luego se coloca en el historial del navegador).
También utilizo un botón de retroceso en la página que mueve al usuario entre páginas usando la
lasthash
matriz. Se parece a esto:Entonces esto moverá al usuario de regreso al último hash y eliminará ese último hash de la matriz (no tengo botón de avance en este momento).
Entonces. ¿Cómo detecto si un usuario ha utilizado mi botón de retroceso en la página o el botón del navegador?
Al principio miré
window.onbeforeunload
, pero fue en vano, eso solo se llama si el usuario va a cambiar de página. Esto no sucede en una aplicación de una sola página que utiliza navegación hash.Entonces, después de un poco más de excavación, vi recomendaciones para tratar de establecer una variable de bandera. El problema con esto en mi caso es que trataría de configurarlo, pero como todo es asíncrono, no siempre se establecerá a tiempo para la instrucción if en el cambio de hash.
.onMouseDown
no siempre se llamaba al hacer clic, y agregarlo a un onclick nunca lo activaría lo suficientemente rápido.Esto es cuando comencé a mirar la diferencia entre
document
, ywindow
. Mi solución final fue establecer el indicador usandodocument.onmouseover
y deshabilitarlo usandodocument.onmouseleave
.Lo que sucede es que mientras el mouse del usuario está dentro del área del documento (léase: la página representada, pero excluyendo el marco del navegador), mi valor booleano se establece en
true
. Tan pronto como el mouse abandona el área del documento, el booleano cambia afalse
.De esta manera, puedo cambiar mi
window.onhashchange
a:Notarás el cheque para
#undefined
. Esto se debe a que si no hay un historial disponible en mi matriz, regresaundefined
. Lo uso para preguntarle al usuario si quiere irse usando unwindow.onbeforeunload
evento.En resumen, y para las personas que no necesariamente usan un botón de retroceso en la página o una matriz para almacenar el historial:
Y ahí lo tienes. Una forma simple de tres partes para detectar el uso del botón de retroceso frente a los elementos en la página con respecto a la navegación hash.
EDITAR:
Para asegurarse de que el usuario no use la tecla de retroceso para activar el evento de retroceso, también puede incluir lo siguiente (Gracias a @thetoolman en esta pregunta ):
fuente
Puede probar el
popstate
controlador de eventos, por ejemplo:Nota: Para obtener los mejores resultados, debe cargar este código solo en páginas específicas donde desea implementar la lógica para evitar cualquier otro problema inesperado.
El evento popstate se activa cada vez que cambia la entrada del historial actual (el usuario navega a un nuevo estado). Eso sucede cuando el usuario hace clic sobre el Back botones de avance o cuando de navegador /
history.back()
,history.forward()
,history.go()
métodos son llamados mediante programación.La
event.state
propiedad is del evento es igual al objeto de estado de historial.Para la sintaxis de jQuery, envuélvala (para agregar incluso un oyente después de que el documento esté listo):
Consulte también: window.onpopstate en la carga de la página
Consulte también los ejemplos en Aplicaciones de una sola página y página pushState HTML5 :
Esto debería ser compatible con Chrome 5+, Firefox 4+, IE 10+, Safari 6+, Opera 11.5+ y similares.
fuente
Había estado luchando con este requisito durante bastante tiempo y tomé algunas de las soluciones anteriores para implementarlo. Sin embargo, me topé con una observación y parece funcionar en los navegadores Chrome, Firefox y Safari + Android y iPhone
En la carga de la página:
Déjeme saber si esto ayuda. Si me falta algo, estaré encantado de entenderlo.
fuente
event
tiene valor incluso para el botón de avanceEn javascript, el tipo de navegación
2
significa que se hace clic en el botón de retroceso o avance del navegador y el navegador está tomando el contenido de la memoria caché.fuente
Esto definitivamente funcionará (para detectar el clic del botón Atrás)
fuente
Mira esto:
funciona bien...
fuente
Esta es la única solución que funcionó para mí (no es un sitio web de una página). Funciona con Chrome, Firefox y Safari.
fuente
La respuesta correcta ya está ahí para responder la pregunta. Quiero mencionar el nuevo JavaScript API PerformanceNavigationTiming , está reemplazando el obsoleto performance.navigation .
El siguiente código iniciará sesión en la consola "back_forward" si el usuario llegó a su página con el botón de retroceso o avance. Eche un vistazo a la tabla de compatibilidad antes de usarla en su proyecto.
fuente
Navegador: https://jsfiddle.net/Limitlessisa/axt1Lqoz/
Para control móvil: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/
fuente
Aquí está mi opinión al respecto. La suposición es que, cuando la URL cambia pero no se hace clic dentro de lo
document
detectado, se trata de un navegador hacia atrás (sí o hacia adelante). Un clic de los usuarios se restablece después de 2 segundos para que esto funcione en páginas que cargan contenido a través de Ajax:fuente
Pude usar algunas de las respuestas en este hilo y otras para que funcione en IE y Chrome / Edge. history.pushState para mí no era compatible con IE11.
fuente
Un componente completo puede implementarse solo si redefine la API (cambia los métodos del 'historial' del objeto) Compartiré la clase que acabo de escribir. Probado en Chrome y Mozilla Solo admite HTML5 y ECMAScript5-6
fuente
Document.mouseover no funciona para IE y Firefox. Sin embargo, he intentado esto:
Esto funciona para Chrome e IE y no para FireFox. Todavía estoy trabajando para que FireFox sea correcto. Cualquier forma fácil de detectar el clic del botón de retroceso / avance del navegador es bienvenida, no particularmente en JQuery sino también en AngularJS o Javascript simple.
fuente
El código anterior funcionó para mí. En los navegadores móviles, cuando el usuario hizo clic en el botón Atrás, queríamos restaurar el estado de la página según su visita anterior.
fuente
Lo resolví haciendo un seguimiento del evento original que activó el
hashchange
(ya sea un deslizamiento, un clic o una rueda), para que el evento no se confunda con un simple aterrizaje en la página y use una bandera adicional en cada uno de mis enlaces de eventos. El navegador no volverá a configurar la bandera alfalse
presionar el botón Atrás:fuente
Probé las opciones anteriores pero ninguna de ellas me funciona. Aquí esta la solución
Consulte este enlace http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Click-Event-Handli para obtener más detalles
fuente