2012-01-28 15 views
16

Problema: dispongo di un sito con contenuto dinamico che deve essere ricaricato ogni volta che l'utente lo visualizza. Ciò include il caso d'uso quando un utente preme il pulsante Indietro su un altro sito e arriva al sito che deve essere ricaricato. La maggior parte dei browser (tutti?) Non aggiornano il sito dopo questo evento.Ricarica il sito quando viene raggiunto tramite il pulsante Indietro del browser

La mia soluzione (che non è del tutto funzionante): http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

window.onbeforeunload = function() { 
    // This function does nothing. It won't spawn a confirmation dialog 
    // But it will ensure that the page is not cached by the browser. 
} 

Ma continua a non aggiornare la pagina.

Qualche idea su cosa può influire/bloccare il comportamento desiderato? Rispettivamente ogni altro suggerimento di soluzione per questo problema?

edit:

Set seguente:

Cache-Control private, must-revalidate, max-age=0 
Expires Sat, 26 Jul 1997 05:00:00 GMT 
Pragma no-cache 

e:

<meta name="cache-control" content="no-cache" /> 
<meta name="expires" content="0" /> 
<meta name="pragma" content="no-cache" /> 

ancora senza successo.

+0

non si dovrebbe tentare di impedire al browser di memorizzare nella cache la pagina. quando uso il pulsante Indietro, mi aspetto che la pagina in cui mi trovavo riappaia com'era quando l'ho lasciata. ma se quella pagina ha elementi di aggiornamento automatico, questi dovrebbero continuare ad aggiornarsi quando torno. –

+0

purtroppo, a volte è necessario, ad esempio: https://www.quora.com/Why-dont-payment-gateway-pages-support-Back-Button-Refresh – ptica

risposta

0

Aiuta?

Reload the page on hitting back button

O con meta-tag,

<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache --> 
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' --> 
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any --> 

Non è sicuro, il meta aiuterà, ma è possibile testarlo.

+0

nope ancora non funziona, vedere la mia modifica nel domanda – sorgenkind

-1

Penso che this question ti aiuterà.

[modifica (Nickolay): ecco perché funziona in questo modo: webkit.org, developer.mozilla.org. Si prega di leggere questi articoli (o il mio riassunto in una risposta separata sotto) e prendere in considerazione se si ha realmente bisogno di fare questo e rendere il vostro caricamento della pagina più lento per gli utenti.]

Nickolay's answer

0

io ti penso bisogno di ricaricare esattamente - window.location.reload(). Ma il problema principale è la soluzione semplice cross browser. Codice su PHP:

$inline_javascript = 'var uniqueString = ' . time() . ';' . 
        'if (uniqueString === window.name) {' . 
        ' window.location.relace();' . 
        '} else {' . 
        ' window.name = uniqueString;' . 
        '}'; 

E stamparlo prima di file css e js in.

2

questo ha funzionato per me, in drupal 7 (php) ogni volta che un utente si disconnette, può premere il pulsante Indietro e in grado di visitare le pagine privilegiate. Se una pagina viene aggiornata, viene indirizzata a una prima pagina in cui non può fare nulla.

<?php 
     //refresh the page after log-out and back button 
     if (!user_is_logged_in()) 
     { 

      print '<input type="hidden" id="refreshed" value="no"> 
       <script type="text/javascript"> 
        onload=function(){ 

        var e=document.getElementById("refreshed"); 
        if(e.value=="no")e.value="yes"; 
        else{e.value="no";location.reload();} 
        } 
       </script>'; 
     } 
    ?> 

qualcuno ha postato here: grazie spero che aiutare anche voi.

54

È necessario utilizzare un nascosto input come indicatore di aggiornamento, con un valore di "no":

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

Ora utilizzando jQuery, è possibile controllare il suo valore:

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

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

Quando si fa clic sul pulsante Indietro, i valori nei campi nascosti mantengono lo stesso valore di quando avevi lasciato la pagina originariamente.

Quindi la prima volta che si carica la pagina, il valore dell'input sarà "no". Quando ritorni alla pagina, sarà "sì" e il tuo codice JavaScript attiverà un aggiornamento.

+3

ha funzionato per me. Ho dovuto usare location.reload (true) per forzare un ricaricamento del server, altrimenti è stato appena ricaricato dalla cache. – Kris

+1

Risposta brillante e semplice. Molte grazie. – RohannG

+1

Che funziona magnificamente - grazie. –

0

Ho trovato una soluzione: aggiungi no-store all'intestazione Cache-Control. L'ho fatto nelle intestazioni http, ma immagino che potrebbe funzionare anche con i meta tag. Testato su Chromium e Firefox.

Vedi anche How to stop chrome from caching

1

Prova questa:

header("Cache-Control: no-store, must-revalidate, max-age=0"); 
header("Pragma: no-cache"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 

// Una data in passato

+0

Questa risposta lo spiega in dettaglio - http://stackoverflow.com/a/2068407 –

0

È possibile utilizzare questo codice in un modulo personalizzato:

<?php 
/** 
* Implements hook_init(). 
*/ 
function MY_MODULE_init() { 
    drupal_add_http_header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate, post-check=0, pre-check=0'); 
} 
?> 
9

Dopo provando varie soluzioni diverse ho scoperto che l'API JavaScript Navigation Timing funziona b est per rilevare le interazioni con il pulsante Indietro.

Tutto quello che dovete fare è questo:

if(!!window.performance && window.performance.navigation.type == 2) 
{ 
    window.location.reload(); 
} 

e funziona bene con tutti i principali browser: http://caniuse.com/#search=Navigation%20Timing%20API

Is My Page Being Loaded from the Browser Cache?

+0

Non riesco a farlo funzionare in Safari 11.0. Qualche indizio? – jorgetutor

0

È possibile utilizzare l'evento window.onpageshow per verificare se il la pagina proviene dalla cache.

window.onpageshow = function (event) { 
    if (event.persisted) { 
    window.location.reload(); //reload page if it has been loaded from cache 
    } 
}; 

Nota che questo richiede browser più moderni di alcune delle risposte precedenti (come IE11 +). Per maggiori informazioni sul supporto del browser, vedi here

Problemi correlati