Cette question est similaire à Suivre lorsque l'utilisateur clique sur le bouton de retour sur le navigateur , mais pas la même chose ... J'ai une solution et je la poste ici pour référence et commentaires. Si quelqu'un a de meilleures options, je suis toute oreille!
La situation est que j'ai une page avec une "édition sur place", à la flickr. C'est-à-dire qu'il y a un DIV "cliquez ici pour ajouter une description", qui lorsque vous cliquez dessus se transforme en TEXTAREA avec les boutons Enregistrer et Annuler. Cliquez sur Enregistrer pour publier les données sur le serveur pour mettre à jour la base de données et placer la nouvelle description dans le DIV à la place de TEXTAREA. Si la page est actualisée, la nouvelle description est affichée à partir de la base de données avec une option «cliquer pour modifier». Des trucs Web 2.0 assez standard de nos jours.
Le problème est que si:
- la page est chargée sans la description
- une description est ajoutée par l'utilisateur
- la page est parcourue en cliquant sur un lien
- l'utilisateur clique sur le bouton retour
Ensuite, ce qui est affiché (à partir du cache du navigateur) est la version de la page sans le DIV modifié dynamiquement contenant la nouvelle description.
C'est un problème assez important car l'utilisateur suppose que sa mise à jour a été perdue et ne comprendra pas nécessairement qu'il doit actualiser la page pour voir les modifications.
La question est donc la suivante: comment marquer une page comme étant modifiée après son chargement, puis détecter quand l'utilisateur «y retourne» et forcer une actualisation dans cette situation?
Réponses:
Utilisez un formulaire caché. Les données du formulaire sont conservées (généralement) dans les navigateurs lorsque vous rechargez ou appuyez sur le bouton Précédent pour revenir à une page. Ce qui suit apparaît dans votre page (probablement vers le bas):
Dans votre javascript, vous aurez besoin des éléments suivants:
Le js qui renifle le formulaire doit s'exécuter une fois le html entièrement analysé, mais vous pouvez mettre le formulaire et le js en ligne en haut de la page (js en second) si la latence de l'utilisateur est un problème sérieux.
la source
Voici une solution moderne très simple à ce vieux problème.
window.performance est actuellement pris en charge par tous les principaux navigateurs.
la source
window.performance && window.performance.navigation.type
lieu de justewindow.performance.navigation.TYPE_BACK_FORWARD
?).window.performance.navigation.TYPE_BACK_FORWARD
est une constante qui est toujours égale à 2. Elle n'est donc utilisée qu'à des fins de comparaison.performance.navigation
soit obsolète et il est suggéré d'utiliser à la place developer.mozilla.org/en-US/docs/Web/API/...2
pour les touches de retour. Jusqu'à la v70, il est retourné de manière incorrecte1
.Cet article l'explique. Voir le code ci-dessous: http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
la source
event.persisted
=false
, même en appuyant sur le bouton de retour. Vous devez utiliserwindow.performance.navigation
ou PerformanceNavigationTiming pour Chrome.Pour les navigateurs modernes, cela semble être le bon moyen maintenant:
Ceci est toujours "expérimental" en janvier 2020, mais semble bien soutenu.
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming
la source
Comme mentionné ci-dessus, j'avais trouvé une solution et je la poste ici pour référence et commentaires.
La première étape de la solution consiste à ajouter les éléments suivants à la page:
Le contenu de
fresh.html
n'est pas important, donc ce qui suit devrait suffire:Lorsque le code côté client met à jour la page, il doit marquer la modification comme suit:
stale.html
fait tout le travail: lorsqu'il est chargé, il appellera lareload_stale_page
fonction qui actualisera la page si nécessaire. La première fois qu'elle est chargée (c'est-à-dire qu'après la modification, lareload_stale_page
fonction ne fera rien.)D'après mes tests (minimes) à ce stade, cela semble fonctionner comme souhaité. Ai-je oublié quelque chose?
la source
Vous pouvez le résoudre en utilisant l' événement onbeforeunload :
Avoir une fonction de gestionnaire d'événements onbeforeunload vide signifie que la page sera recréée à chaque fois qu'elle est accédée. Les javascripts seront réexécutés, les scripts côté serveur seront réexécutés, la page sera construite comme si l'utilisateur la frappait pour la toute première fois, même si l'utilisateur accédait à la page simplement en appuyant sur le bouton Précédent ou Suivant .
Voici le code complet d'un exemple:
Essayez-le, quittez cette page, puis revenez en utilisant les boutons «Précédent» ou «Suivant» de votre navigateur.
Cela fonctionne très bien dans IE, FF et Chrome.
Bien sûr, vous pouvez faire ce que vous voulez dans la fonction myfun .
Plus d'infos: http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
la source
Vous pouvez utiliser localStorage ou sessionStorage ( http://www.w3schools.com/html/html5_webstorage.asp ) pour définir un indicateur (au lieu d'utiliser un formulaire masqué).
la source
En utilisant cette page, en intégrant notamment le commentaire de @sajith sur la réponse de @Nick White et cette page: http://www.mrc-productivity.com/techblog/?p=1235
la source
Voici une version de jQuery. J'ai eu besoin de l'utiliser plusieurs fois en raison de la façon dont Safari Desktop / mobile gère le cache lorsqu'un utilisateur appuie sur le bouton Retour.
la source
J'ai rencontré un problème similaire aujourd'hui et je l'ai résolu avec localStorage (ici avec un peu de jQuery):
Si fondamentalement:
Sur la page 1, lorsque l'utilisateur soumet le formulaire, nous définissons une valeur «étapes» dans localStorage pour indiquer quelle étape l'utilisateur a prise. En même temps, nous lançons une fonction avec timeout qui vérifiera si cette valeur a été modifiée (par exemple 10 fois / seconde).
À la page 2, nous modifions immédiatement ladite valeur.
Donc, si l'utilisateur utilise le bouton Précédent et que le navigateur restaure la page 1 dans l'état exact où elle était lorsque nous l'avons quittée, la fonction checkSteps est toujours en cours d'exécution et capable de détecter que la valeur dans localStorage a été modifiée (et peut prendre les mesures appropriées ). Une fois que cette vérification a rempli son objectif, il n'est pas nécessaire de continuer à l'exécuter, nous n'utilisons donc plus setTimeout.
la source