294 votes

Vérifier si la page est rechargée ou rafraîchie en JavaScript

Je veux vérifier quand quelqu'un essaie de rafraîchir une page.

Par exemple, lorsque j'ouvre une page, rien ne se passe, mais lorsque je rafraîchis la page, une alerte doit s'afficher.

1 votes

Pas vraiment possible sans code côté serveur. Pourquoi en avez-vous besoin ? Si vous nous donnez une vue d'ensemble, nous pourrons peut-être vous proposer une meilleure solution.

0 votes

Peut-être que vous pourriez faire une telle chose avec un cookie... comme stocker l'heure et sur le rechargement comparer la différence de temps.

0 votes

Je veux faire en sorte que le lien facebook soit #!/n'importe quoi. Je veux supprimer le # ! lorsque la page se recharge uniquement.

276voto

Rahul Jain Points 2725

window.performance.navigation.type est obsolète, voir Réponse de la Commission


Une meilleure façon de savoir si la page est effectivement rechargée est d'utiliser l'objet navigateur qui est pris en charge par la plupart des navigateurs modernes.

Il utilise le API de chronométrage de la navigation .

//check for Navigation Timing API support
if (window.performance) {
  console.info("window.performance works fine on this browser");
}
console.info(performance.navigation.type);
if (performance.navigation.type == performance.navigation.TYPE_RELOAD) {
  console.info( "This page is reloaded" );
} else {
  console.info( "This page is not reloaded");
}

source : https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API

1 votes

Merci mon pote c'est une solution précise pour détecter si la page est rechargée par un clic droit/rafraîchissement du navigateur ou rechargée par l'url.

4 votes

Attention, Chrome a récemment modifié ce comportement. Lorsque l'utilisateur clique sur la barre d'adresse actuelle et appuie sur la touche Entrée, la valeur de performance.navigation.type sera de 1 alors qu'elle devrait être de 0. J'ai testé dans la version 56. Je ne sais pas exactement pourquoi.

0 votes

Il fonctionne toujours dans Firefox 52 mais pas dans Chrome 57. Rechargement en cliquant sur le bouton de rechargement ou en plaçant le curseur dans la barre d'adresse et en appuyant sur la touche Entrée ou Retour. performance.navigation.type valeur de 1 .

121voto

Nouvelle norme 2018-maintenant (PerformanceNavigationTiming)

window.performance.navigation la propriété est déprécié dans le Navigation Timing Niveau 2 spécification. Veuillez utiliser le PerformanceNavigationTiming à la place.

PerformanceNavigationTiming.type

Il s'agit d'un technologie expérimentale .

Vérifiez le Tableau de compatibilité des navigateurs soigneusement avant de l'utiliser en production.

Vérifier si la page est rechargée ou rafraîchie en JavaScript

const pageAccessedByReload = (
  (window.performance.navigation && window.performance.navigation.type === 1) ||
    window.performance
      .getEntriesByType('navigation')
      .map((nav) => nav.type)
      .includes('reload')
);

alert(pageAccessedByReload);

Support le 2019-07-08

La propriété type, en lecture seule, renvoie une chaîne de caractères représentant le type de navigation. La valeur doit être l'une des suivantes :

  • naviguer sur - La navigation a commencé en cliquant sur un lien, en saisissant l'URL dans la barre d'adresse du navigateur, en soumettant un formulaire ou en s'initialisant par le biais d'une opération script autre que reload et back_forward comme indiqué ci-dessous.

  • recharger - La navigation se fait par le biais de l'opération de rechargement du navigateur ou location.reload() .

  • retour_en avant - La navigation se fait par le biais de l'opération de traversée de l'historique du navigateur.

  • prérendu - La navigation est initiée par un indice de prérenduction .

Cette propriété est en lecture seule.

L'exemple suivant illustre l'utilisation de cette propriété.

function print_nav_timing_data() {
  // Use getEntriesByType() to just get the "navigation" events
  var perfEntries = performance.getEntriesByType("navigation");

  for (var i=0; i < perfEntries.length; i++) {
    console.log("= Navigation entry[" + i + "]");
    var p = perfEntries[i];
    // dom Properties
    console.log("DOM content loaded = " + (p.domContentLoadedEventEnd - p.domContentLoadedEventStart));
    console.log("DOM complete = " + p.domComplete);
    console.log("DOM interactive = " + p.interactive);

    // document load and unload time
    console.log("document load = " + (p.loadEventEnd - p.loadEventStart));
    console.log("document unload = " + (p.unloadEventEnd - p.unloadEventStart));

    // other properties
    console.log("type = " + p.type);
    console.log("redirectCount = " + p.redirectCount);
  }
}

23 votes

+1 pour avoir signalé l'API obsolète, mais -100 à Apple pour son manque de support dans iOS encore en 2020.

4 votes

Merci d'avoir signalé que out. Voici donc la solution entièrement compatible : jsfiddle.net/j9o1khcw/2

1 votes

@0nline J'ai essayé votre solution et cela n'a pas fonctionné pour moi FYI.

44voto

DitherSky Points 400

La première étape consiste à vérifier sessionStorage pour une certaine valeur prédéfinie et s'il existe, alerter l'utilisateur :

if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');

La deuxième étape consiste à définir sessionStorage à une certaine valeur (par exemple true ) :

sessionStorage.setItem("is_reloaded", true);

Les valeurs de la session sont conservées jusqu'à la fermeture de la page, de sorte qu'elles ne fonctionnent que si la page est rechargée dans un nouvel onglet du site. Vous pouvez également conserver le nombre de recharges de la même manière.

40 votes

Deux choses dont il faut être conscient : 1). Vous ne pouvez stocker que des valeurs de type chaîne dans la session et le stockage local. Par conséquent, true est converti en "true" . 2). Le stockage de la session persiste jusqu'à ce que l'utilisateur ferme la fenêtre du navigateur, de sorte qu'il est impossible de faire la différence entre le rechargement d'une page et le fait de quitter votre site et d'y revenir au cours de la même session de navigation.

0 votes

SessionStorage peut être modifié depuis le navigateur ? Corrigez-moi si je me trompe. Quelqu'un peut ajouter/supprimer la clé et votre logique/code peut être contourné.

0 votes

Notez que le sessionStorage est restauré si vous fermez l'onglet et le restaurez à partir de ctrl+shift+T Cela peut être une faille potentielle dans la sécurité dans un lieu public lorsque vous avez besoin de nettoyer le jeton de session.

17voto

techfoobar Points 33807

Enregistrez un cookie la première fois que quelqu'un visite la page. Lors de l'actualisation, vérifiez si votre cookie existe et si c'est le cas, alertez-le.

function checkFirstVisit() {
  if(document.cookie.indexOf('mycookie')==-1) {
    // cookie doesn't exist, create it now
    document.cookie = 'mycookie=1';
  }
  else {
    // not first visit, so alert
    alert('You refreshed!');
  }
}

et dans votre balise body :

<body onload="checkFirstVisit()">

14 votes

Qu'en est-il des utilisateurs qui reviennent ?

6 votes

Comme le dit @Rob2211, cela ne vérifie que si la page a été visitée et peut donner un faux positif tant que la page est revisitée lorsque le cookie est toujours actif. Ne l'utilisez pas pour vérifier le rafraîchissement.

1 votes

@Brannon - Le cookie est créé sans valeur d'expiration et sera détruit à la fermeture du navigateur.

15voto

Ali Sheikhpour Points 5018

J'ai écrit cette fonction pour vérifier les deux méthodes en utilisant l'ancien système. window.performance.navigation et de nouvelles performance.getEntriesByType("navigation") en même temps :

function navigationType(){

    var result;
    var p;

    if (window.performance.navigation) {
        result=window.performance.navigation;
        if (result==255){result=4} // 4 is my invention!
    }

    if (window.performance.getEntriesByType("navigation")){
       p=window.performance.getEntriesByType("navigation")[0].type;

       if (p=='navigate'){result=0}
       if (p=='reload'){result=1}
       if (p=='back_forward'){result=2}
       if (p=='prerender'){result=3} //3 is my invention!
    }
    return result;
}

Description du résultat :

0 : cliquer sur un lien, saisir l'URL dans la barre d'adresse du navigateur, soumettre un formulaire, cliquer sur un signet, initialiser par une opération script.

1 : En cliquant sur le bouton Recharger ou en utilisant Location.reload()

2 : Travailler avec l'historique des navigateurs (Bakc et Forward).

3 : activité de prérendu comme <link rel="prerender" href="http://stackoverflow.com//example.com/next-page.html">

4 : toute autre méthode.

1 votes

La meilleure solution trouvée sur le web. Ça a marché ! Merci.

0 votes

Cela ne fonctionne pas dans safari. le tableau retourné est vide.

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