199 votes

Comment forcer le rechargement d'une page lorsque l'on utilise le bouton retour du navigateur ?

J'ai besoin de détecter d'une manière ou d'une autre que l'utilisateur a appuyé sur le bouton retour du navigateur et de recharger la page avec un rafraîchissement (rechargement du contenu et du CSS) en utilisant jquery.

Comment détecter une telle action via jquery ?

En effet, à l'heure actuelle, certains éléments ne sont pas rechargés si j'utilise le bouton retour du navigateur. Mais si j'utilise des liens dans le site Web, tout est rafraîchi et s'affiche correctement.

IMPORTANT !

Certaines personnes ont probablement mal compris ce que je veux. Je ne veux pas rafraîchir la page en cours. Je veux rafraîchir la page qui est chargée après avoir appuyé sur le bouton retour. Voici ce que je veux dire de manière plus détaillée :

  1. L'utilisateur visite la page1.
  2. alors qu'il se trouve sur la page 1, il clique sur un lien vers la page 2.
  3. il est redirigé vers la page2
  4. maintenant (partie importante !) il clique sur le bouton "retour" dans le navigateur parce qu'il veut revenir à la page 1.
  5. il est de retour sur la page 1 - et maintenant la page 1 est rechargée et quelque chose est alerté comme "Vous êtes de retour !".

0 votes

Au lieu de pirater le comportement normal de l'utilisateur, pourquoi n'essayez-vous pas de comprendre pourquoi votre code ne fonctionne pas au chargement de la page et que la page doit être rechargée ?

6 votes

@LelioFaieta Je change les classes pour montrer les changements. Si l'utilisateur clique sur quelque chose, la valeur change dans la base de données via ajax. Quand l'ajax est fait, la classe css change par exemple de on à off . Et c'est bon, c'est enregistré dans la base de données, les utilisateurs voient tout correctement. Maintenant il clique sur un autre lien. Par exemple la page "about us", n'est-ce pas ? Maintenant, il est sur la page à propos de nous. Il décide de revenir à la page précédente et clique sur le bouton retour du navigateur. Et quand il est de retour, il voit les changements sur la page comme le navigateur a montré la page (probablement un changement de navigateur) avant de déclencher l'ajax (classes on/off).

1 votes

Utilisez-vous get ou post pour votre appel Ajax ?

167voto

Leonid Vasilev Points 6979

Vous pouvez utiliser pageshow pour gérer la situation lorsque le navigateur navigue vers votre page par le biais de l'historique :

window.addEventListener( "pageshow", function ( event ) {
  var historyTraversal = event.persisted || 
                         ( typeof window.performance != "undefined" && 
                              window.performance.navigation.type === 2 );
  if ( historyTraversal ) {
    // Handle page restore.
    window.location.reload();
  }
});

Notez que le cache HTTP peut également être impliqué. Vous devez définir correctement les en-têtes HTTP liés au cache sur le serveur pour mettre en cache uniquement les ressources qui doivent l'être. Vous pouvez également effectuer un rechargement forcé pour que le navigateur ignore le cache HTTP : window.location.reload( true ) . Mais je ne pense pas que ce soit la meilleure solution.

Pour plus d'informations, consultez le site :

0 votes

Pourriez-vous aider l'utilisateur Dhiraj, il est sur la bonne voie mais il se recharge deux fois. Au fait, j'ai essayé window.addEventListener( "unload", function() {} ); mais cela ne fait rien, le bouton retour fonctionne comme avant, aucun changement ;(

0 votes

Comment décharger le BFCache ? Pourriez-vous mettre à jour votre code avec des informations plus spécifiques ? Cette ligne window.addEventListener( "unload", function() {} ); ne fonctionne pas. Est-il complet ?

0 votes

La traversée de l'historique de Chrome est quelque peu déroutante. Veuillez essayer pageshow solution.

84voto

James Points 1858

Cela fait un moment que cet article a été publié, mais j'ai trouvé une solution plus élégante si vous n'avez pas besoin de prendre en charge les anciens navigateurs.

Vous pouvez faire une vérification avec

performance.navigation.type

La documentation, y compris la prise en charge des navigateurs, se trouve ici : https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation

Donc pour voir si la page a été chargée depuis l'historique en utilisant le retour, vous pouvez faire

if(performance.navigation.type == 2){
   location.reload(true);
}

Le site 2 indique que la page a été consultée en naviguant dans l'historique. D'autres possibilités sont

0: La page a été consultée en suivant un lien, un signet, une soumission de formulaire ou un script, ou en tapant l'URL dans la barre d'adresse.

1: L'accès à la page s'est fait en cliquant sur le bouton Reload ou via la méthode Location.reload().

255: Tout autre moyen

Elles sont détaillées ici : https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigation


Note Performance.navigation.type est maintenant déprécié en faveur de PerformanceNavigationTiming.type qui renvoie 'naviguer' / 'recharger' / 'retour_avant' / 'prérendu' : https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming/type

3 votes

Cette vérification a fonctionné pour moi. Que signifie exactement le 2 ?

0 votes

Cela a fonctionné comme un charme Je l'ai placé dans la zone la plus haute et la page se rechargeait sans charger aucun autre script.

0 votes

Cela a marché comme un charme. Belle trouvaille... C'est très rapide et fiable, pas comme les autres réponses qui étaient lentes comparées à celle-ci. TY

37voto

Francesco Points 160

Utilisez simplement jquery :

jQuery( document ).ready(function( $ ) {

   //Use this inside your document ready jQuery 
   $(window).on('popstate', function() {
      location.reload(true);
   });

});

Ce qui précède fonctionnera à 100% lorsque le bouton de retour ou d'avance a été cliqué en utilisant l'ajax également.

si ce n'est pas le cas, il doit y avoir une mauvaise configuration dans une autre partie du script.

Par exemple, il pourrait ne pas se recharger si quelque chose comme l'un des exemples de l'article précédent est utilisé. window.history.pushState('', null, './');

donc lorsque vous utilisez history.pushState(); assurez-vous de l'utiliser correctement.

Suggestion dans la plupart des cas, vous aurez juste besoin :

history.pushState(url, '', url); 

Pas de window.history... et assurez-vous que url est défini.

J'espère que cela vous aidera

0 votes

0 votes

@RitchieD - A ce jour, cela fonctionne bien dans IE11 sur Windows 10. Note : Je n'utilise pas EDGE.

0 votes

Je ne suis pas fan des réponses du type "utilisez simplement jQuery", désolé.

7voto

Dhiraj Points 1000

Vous devez utiliser une entrée cachée comme indicateur de rafraîchissement, avec la valeur "non" :

<input type="hidden" id="refresh" value="no">

Maintenant, en utilisant jQuery, vous pouvez vérifier sa valeur :

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

Lorsque vous cliquez sur le bouton retour, les valeurs des champs cachés conservent la même valeur que lorsque vous avez quitté la page.

Ainsi, la première fois que vous chargez la page, la valeur de l'entrée est "non". Lorsque vous revenez sur la page, elle sera "oui" et votre code JavaScript déclenchera une actualisation.

2 votes

Cela ne fonctionne pas. J'ai essayé Firefox et Chrome et ça ne marche pas.

0 votes

S'il vous plaît, vérifiez ma question mise à jour, peut-être que vous et d'autres m'ont mal compris. C'est beaucoup plus clair maintenant, ce que je veux accomplir. Merci.

0 votes

Oui, j'ai mal compris. Merci d'avoir mis à jour la question en détail.

1voto

Anton Stepanenkov Points 690

Le rechargement est facile. Vous devriez utiliser :

location.reload(true);

Et la détection de retour est :

window.history.pushState('', null, './');
  $(window).on('popstate', function() {
   location.reload(true);
});

0 votes

Cela ne fonctionne pas ;( J'ai essayé alert('test'); au lieu de location.reload(true); mais toujours rien. J'ai essayé firefox et chrome mais rien. J'ai essayé à l'intérieur du document prêt, à l'extérieur, mais rien ne fonctionne. Si j'essaie simplement alert() ou tout autre code jquery, cela fonctionne. J'ai beaucoup de code jquery sur ma page et cela fonctionne.

0 votes

J'ai édité la réponse, essayez la nouvelle solution. Le problème est que vous devez pousser l'état avant, ou vous n'obtiendrez pas l'événement popstate.

0 votes

Vous avez probablement mal compris ce que je veux. J'ai mis à jour ma question avec une description plus détaillée. Veuillez la vérifier à nouveau si vous avez le temps, merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X