web-dev-qa-db-fra.com

Forcer un rechargement de page dans Chrome à l'aide de Javascript [pas de cache]

Je dois recharger une page à l'aide de JavaScript et veiller à ce qu'elle ne soit pas extraite du cache du navigateur, mais qu'elle recharge à la place la page à partir du serveur. [Comme des éléments de la page auront changé entre-temps]

Sur IE et FF, j'ai constaté que le code suivant fonctionnait correctement.

window.location.reload(true);

Cependant, cela ne fonctionne pas sur Chrome ou Safari.

J'ai essayé ce qui suit, mais aussi en vain;

window.location.replace(location.href);
document.location.reload(true);
document.location.replace(location.href);

Y a-t-il une solution à ce problème?

Résultats

Après avoir examiné cette question, j'ai constaté qu'il s'agissait d'un problème lié à la gestion du protocole HTTP.

  1. Chrome envoie une demande avec le champ HTTP Pragma: no-cache
  2. Le serveur répond avec le champ Last-Modified: DATE1
  3. JS utilise location.reload(true) pour forcer un rechargement à partir du serveur, pas en cache
  4. Chrome envoie une demande avec le champ If-Modified-Since: DATE1
  5. Le serveur répond avec HTTP Status 304 Not Modified

L’application serveur est responsable de ne pas avoir remarqué le changement d’état dans le contenu de la page dynamique et par conséquent de ne pas renvoyer un 200. Toutefois, Chrome/WebKit est le seul navigateur à envoyer un champ If-Modified-Since lorsque le JS location.reload(true) est appelé. .

Je pensais mettre mes conclusions ici si quelqu'un d'autre rencontrait le même problème.

18
graney

Vous pouvez utiliser ce hack:

 $.ajax({
        url: window.location.href,
        headers: {
            "Pragma": "no-cache",
            "Expires": -1,
            "Cache-Control": "no-cache"
        }
    }).done(function () {
        window.location.reload(true);
    });
9
Suhan

Pour vous assurer que la page n'est pas chargée à partir du cache, vous pouvez ajouter un numéro unique à interroger:

window.location = location.href + '?upd=' + 123456;

Vous pouvez également utiliser la date au lieu de 123456

5
m03geek

De grandes découvertes! Je viens de rencontrer le même problème et cela aide beaucoup! Cependant, en plus de votre conclusion, il semble que Chrome envoie toujours une requête GET pour location.reload () ... IE/FF répète la même chose. dernière demande à la place.

1
Roy Ling

Voici ce que je fais pour assurer le rechargement forcé de mon fichier d'application sur chrome:

    var oAjax = new XMLHttpRequest;
    oAjax.open( 'get', '/path/to/my/app.js' );
    oAjax.setRequestHeader( 'Pragma', 'no-cache' );
    oAjax.send();
    oAjax.onreadystatechange = function() {
        if( oAjax.readyState === 4 ) {
            self.location.reload();
        }
    }
0
Juergen Riemer

Essayez window.location = window.location

0
TW147