2012-02-25 8 views
6

Sto utilizzando la cronologia HTML 5 per salvare lo stato quando vengono richieste le richieste Ajax e fornisco il contenuto HTML completo se la richiesta dell'utente alla stessa pagina con nessuna richiesta Ajax."Riapre l'ultima scheda chiusa" che provoca la visualizzazione dell'ultimo contenuto della richiesta Ajax

La funzionalità "Riapri ultima scheda chiusa" del browser porta l'ultimo contenuto della richiesta Ajax senza colpire il server. Se il browser dovesse richiedere senza portare il contenuto dell'ultima richiesta, tutto funzionerebbe senza problemi. Ma il browser mostra solo l'ultimo contenuto di richiesta Ajax.

Ho sperimentato questo su Chrome 17, Firefox 10 (non l'ho provato su IE9 perché non ha il supporto storia api)

Qual è la soluzione ben noto per questo problema?

Modifica: queste richieste Ajax sono solo "get" richiesta al server.

non è davvero possibile dimostrarlo in jsfiddle.net perché pochi motivi. Puoi dimostrarlo nel tuo localhost come di seguito.

Effettuare la richiesta "get" al server e tirare gli oggetti json, quindi spingere l'url nella cronologia come in basso.

history.pushState(null,null,url); 

Quindi chiudere la scheda e fare clic sulla funzionalità "Riapri ultima scheda chiusa" del browser. Cosa vedi ? Corpo di risposta JSON? Il browser lo mostra senza fare richiesta al server, giusto?

+0

Chiunque ha un'idea? – Freshblood

+1

Puoi pubblicare del codice o un link a una pagina che dimostra il problema? – robertc

+0

@robertc Ho una domanda aggiornata e fornito informazioni di dimostrazione. – Freshblood

risposta

4

Il problema era causato dalle intestazioni delle risposte http. Le intestazioni erano contenenti informazioni memorizzabili nella cache per le richieste ajax, quindi il browser mostrava il contenuto dell'URL dalla cache senza colpire il database.

Dopo aver rimosso i parametri della cache dalle intestazioni di risposta, il browser è stato in grado di colpire il server senza portare contenuto dalla cache.

0

Dipende tutto da quale browser si sta utilizzando e quali ottimizzazioni sono abilitate.

Google Chrome, ad esempio, manterrà la pagina in memoria, quindi quando si preme e si torna a un nuovo sito, o quando si riapre la scheda chiusa - ripristinerà la pagina dalla memoria.

I browser meno recenti/più recenti aggiorneranno semplicemente qualsiasi cosa.

Anche se questo non dovrebbe essere un problema, come lo stato di javascript dovrebbe essere ripristinato pure - dovrebbe essere esattamente lo stesso in ogni modo quando riaprono quella pagina.

+0

Sto usando l'ultima versione di Chrome e Firefox senza modificare alcuna impostazione. non dovrebbe esserci un problema L'utente vede completamente il contenuto dell'ultima richiesta di posta json. Non sono in grado di mostrargli l'ultimo stato della pagina. Sto usando sammy js per raggiungerli. – Freshblood

1

Quando si riapre una scheda chiusa, il browser può riutilizzare i dati dalla cache affinché l'URL specificato compaia la finestra. Dal momento che i dati nella cache provengono dalla risposta alla richiesta di ajax, questo è ciò che utilizza e viene visualizzato il JSON.

Questo porta alla domanda: perché il browser non ha utilizzato l'HTML dalla cache quando ha soddisfatto la richiesta di ajax? I browser utilizzano regole diverse per determinare se utilizzare il contenuto memorizzato nella cache a seconda di ciò che stanno facendo. In questo caso, sembra che Chrome sia felice di riutilizzarlo quando ripristina la scheda chiusa di recente e non quando fa la richiesta Ajax.

È possibile correggerlo dicendo al browser di mai memorizzare nella cache la risposta. Se ciò è desiderabile dipende dal tuo caso d'uso.

Per esempio, l'inserimento di questi nella parte superiore del file (dopo il tag di apertura <?php, ovviamente) lo rende non accada per me:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
Problemi correlati