Esta pregunta es similar a Rastrear cuando el usuario presiona el botón Atrás en el navegador , pero no es lo mismo ... Tengo una solución y la estoy publicando aquí para referencia y comentarios. Si alguien tiene mejores opciones, ¡soy todo oídos!
La situación es que tengo una página con una "edición en el lugar", a la flickr. Es decir, hay un DIV "haga clic aquí para agregar una descripción", que al hacer clic se convierte en un TEXTAREA con los botones Guardar y Cancelar. Al hacer clic en Guardar, se publican los datos en el servidor para actualizar la base de datos y se coloca la nueva descripción en el DIV en lugar de TEXTAREA. Si se actualiza la página, se muestra la nueva descripción de la base de datos con una opción de "hacer clic para editar". Material web 2.0 bastante estándar en estos días.
El problema es que si:
- la página se carga sin la descripción
- el usuario agrega una descripción
- se navega desde la página haciendo clic en un enlace
- el usuario hace clic en el botón Atrás
Luego, lo que se muestra (del caché del navegador) es la versión de la página sin el DIV modificado dinámicamente que contiene la nueva descripción.
Este es un problema bastante grande ya que el usuario asume que su actualización se ha perdido y no necesariamente entenderá que necesita actualizar la página para ver los cambios.
Entonces, la pregunta es: ¿Cómo se puede marcar una página como modificada después de que se ha cargado, y luego detectar cuando el usuario "vuelve a ella" y forzar una actualización en esa situación?
fuente
Respuestas:
Utilice un formulario oculto. Los datos del formulario se conservan (normalmente) en los navegadores cuando recargas o presionas el botón Atrás para regresar a una página. Lo siguiente va en su página (probablemente cerca de la parte inferior):
En su javascript, necesitará lo siguiente:
El js que rastrea el formulario debe ejecutarse después de que el html se haya analizado por completo, pero puede colocar tanto el formulario como el js en línea en la parte superior de la página (segundo js) si la latencia del usuario es una preocupación seria.
fuente
Aquí hay una solución moderna muy fácil para este viejo problema.
window.performance actualmente es compatible con todos los principales navegadores.
fuente
window.performance && window.performance.navigation.type
lugar de solowindow.performance.navigation.TYPE_BACK_FORWARD
?).window.performance.navigation.TYPE_BACK_FORWARD
es una constante que siempre es igual a 2. Por lo tanto, solo se usa para comparar.performance.navigation
está en desuso y se sugiere utilizar en su lugar developer.mozilla.org/en-US/docs/Web/API/…2
para las pulsaciones del botón Atrás. Hasta v70, devolvió incorrectamente1
.Este artículo lo explica. Consulte el código a continuación: http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
fuente
event.persisted
=false
, incluso cuando se presiona desde el botón Atrás. Debe utilizarwindow.performance.navigation
o PerformanceNavigationTiming para Chrome.Para los navegadores modernos, esta parece ser la forma correcta ahora:
Esto sigue siendo "experimental" a enero de 2020, pero parece tener un buen soporte.
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming
fuente
Como se mencionó anteriormente, encontré una solución y la estoy publicando aquí para referencia y comentarios.
La primera etapa de la solución es agregar lo siguiente a la página:
El contenido de
fresh.html
no es importante, por lo que lo siguiente debería ser suficiente:Cuando el código del lado del cliente actualiza la página, debe marcar la modificación de la siguiente manera:
stale.html
hace todo el trabajo: cuando se carga, llamará a lareload_stale_page
función que actualizará la página si es necesario. La primera vez que se carga (es decir, después de realizar la modificación, lareload_stale_page
función no hará nada).De mis pruebas (mínimas) en esta etapa, esto parece funcionar como se desea. ¿He pasado por alto algo?
fuente
Puedes resolverlo usando el evento onbeforeunload :
Tener una función de administrador de eventos vacía onbeforeunload significa que la página se reconstruirá cada vez que se acceda. Los javascripts se volverán a ejecutar, los scripts del lado del servidor se volverán a ejecutar, la página se creará como si el usuario la estuviera presionando por primera vez, incluso si el usuario llegó a la página con solo presionar el botón de retroceso o avance. .
Aquí está el código completo de un ejemplo:
Pruébelo, navegue fuera de esta página y luego vuelva usando los botones "Atrás" o "Adelante" en su navegador.
Funciona bien en IE, FF y Chrome.
Por supuesto que puedes hacer lo que quieras dentro función myfun .
Más información: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
fuente
Puede usar localStorage o sessionStorage ( http://www.w3schools.com/html/html5_webstorage.asp ) para establecer una bandera (en lugar de usar un formulario oculto).
fuente
Usando esta página, especialmente incorporando el comentario de @sajith sobre la respuesta de @Nick White y esta página: http://www.mrc-productivity.com/techblog/?p=1235
fuente
Aquí hay una versión de jQuery. Me he encontrado con la necesidad de usarlo varias veces debido a la forma en que Safari para escritorio / móvil maneja el caché cuando un usuario presiona el botón Atrás.
fuente
Hoy me encontré con un problema similar y lo resolví con localStorage (aquí con un poco de jQuery):
Si básicamente:
En la página 1, cuando el usuario envía el formulario, establecemos un valor "pasos" en localStorage para indicar qué paso ha dado el usuario. Al mismo tiempo, lanzamos una función con timeout que comprobará si este valor ha sido modificado (por ejemplo, 10 veces / segundo).
En la página 2, cambiamos inmediatamente dicho valor.
Entonces, si el usuario usa el botón Atrás y el navegador restaura la página 1 en el estado exacto en que la dejamos, la función checkSteps aún se está ejecutando y es capaz de detectar que el valor en localStorage ha cambiado (y puede tomar la acción apropiada ). Una vez que esta verificación ha cumplido su propósito, no es necesario seguir ejecutándola, por lo que simplemente ya no usamos setTimeout.
fuente