Empêcher le cache sur le bouton arrière de Safari 5

Que de la récente safari 5 est sorti, et il s'avère que la cause de certains problèmes pour mon site web. J'ai un site web dynamique courant ASP classique (bien que cela ne devrait pas compter beaucoup) et le site a une certaine utilisation créative de la pile de l'histoire. Par exemple, vous pouvez être sur une page qui liste des produits, puis aller dans les détails d'un produit et changer le produit (Vue admin). Lorsque vous cliquez sur enregistrer sur le produit, l'information est envoyée au serveur via AJAX, et un history.back() est émis. Cela fonctionne grand dans tous les navigateurs (y compris safari <= 4), cependant, dans le safari 5 nouvellement publié, il a cessé de fonctionner. Il semble que lorsque vous cliquez sur retour dans safari 5 il ne rafraîchit pas réellement la page, il ne la charge que depuis le cache, ce qui signifie que les changements effectués dans la vue détails ne sont pas affichés. Comment puis-je faire pour que cela fonctionne dans safari 5? C'est le code courant que je dois désactiver la mise en cache (inclus en haut de chaque page):

Dim pStr
pStr = "private, no-cache, no-store, must-revalidate"
Response.AddHeader "pragma","no-cache"      '?
Response.AddHeader "cache-control", pStr    '?  Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "cache-control", "post-check=0, pre-check=0"     '?  Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT"       '?
Response.AddHeader "Last-Modified", Now()
23
demandé sur Alxandr 2011-03-14 13:02:53

3 réponses

le handler vide unload ne fonctionnera plus. À la place, vous pouvez vérifier la propriété persisted de l'événement onpageshow . Il est défini à false lors du chargement de la page initiale. Lorsque la page est chargée de bfcache elle est définie à true.

Kludgish solution est de forcer un rechargement lorsque la page est chargée de bfcache.

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload() 
    }
};

si vous utilisez jQuery alors faites:

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        window.location.reload() 
    }
});
45
répondu Mika Tuupola 2013-11-12 16:51:00

après quelques recherches sur Google, j'ai trouvé une solution, même si je n'en suis pas très heureux. Le fait de placer onunload="" dans la balise body-tag provoque Safari à invalider la page et à la recharger uppon window.history.back(); .

7
répondu Alxandr 2011-03-14 23:37:30

Voici une autre façon:

    function invalidateBackCache() {
        // necessary for Safari: mobile & desktop
    }

    window.addEventListener("unload", invalidateBackCache, false);

j'ai choisi cette route car ajouter HTML (onunload="") à la balise body dans .Net impliquait de modifier trois fichiers dans mon cas. Définir l'attribut onunload dans jQuery ne l'a pas résolu non plus.

cela fonctionne aussi pour mobile Sarfari (iPad).

3
répondu webXL 2011-09-22 16:33:57