Per migliorare le prestazioni/la reattività del mio sito Web ho implementato un caricamento parziale della pagina utilizzando AJAX, replaceState, pushState e un listener popstate.Pulsante indietro dell'API cronologia HTML5 con carichi di pagina parziali
In sostanza, memorizzo la parte centrale della mia pagina (HTML) come oggetto di stato nella cronologia. Quando si fa clic su un collegamento, chiedo solo il bit centrale della pagina dal server (identificando queste richieste con un'intestazione Accept diversa) e lo sostituisco con javascript. Su popstate afferro la parte centrale precedente e la spingo indietro nel dom.
Principalmente funziona bene, tuttavia ho trovato un problema particolare su cui sono bloccato. È un po 'complicato da spiegare, quindi mi scuso se questo non è molto chiaro.
C'è un modulo di ricerca sulla maggior parte delle nostre pagine. Il caricamento parziale della pagina tramite ajax è solo su richieste GET e il modulo esegue un POST che si traduce in un caricamento di pagina completo.
Se a navigare la seguente serie di pagine, io alla fine su una pagina parziale malformati composto da SOLO il contenuto centrale, senza che nessuna delle dom circostante:
Start sulla pagina principale (via piena pagina carico) - eseguire una ricerca (post-redirect-get)
vi porta ai risultati della ricerca (attraverso pieno carico pagina) - scegliere la casa
voi di tornare alla pagina principale (via get dinamica) - clicca navigatore indietro
Ricerca Risultati (dal listener popstate) - fare clic sul browser indietro
home malformato pag e.
Quando viene visualizzata la home page non valida, il mio listener popstate non è affatto presente.
Quello che penso che stia accadendo, è che il secondo caricamento (dinamico, parziale) della home page viene memorizzato nella cache dal browser, e quindi quando si verifica il retro della pagina intera, il browser sta semplicemente mostrando il parziale memorizzato nella cache risposta piuttosto che la pagina intera.
Per provare a porre rimedio a ciò ho aggiunto un Vary: Accept intestazione alla risposta per consentire ai browser di sapere che il contenuto potrebbe cambiare in base all'intestazione di accettazione. Ho anche aggiunto Cache-Control max-age = 0, pragma no-cache e una data di scadenza passata al contenuto caricato parziale per provare a forzare il browser a non mettere in cache questo, ma nessuno di questi lo risolve.
Sfortunatamente la mia azienda non consente il traffico esterno ai nostri server di sviluppo, quindi non posso mostrarvi il problema. Ho esaminato varie domande simili qui, ma nessuna sembra essere la stessa, né le soluzioni suggerite sembrano funzionare.
Se aggiungo un parametro senza senso (blah = blah) alle mie richieste GET dinamiche, questo risolve il problema. Comunque questo è un brutto scherzo che preferirei non fare. Questo sembra che dovrebbe essere risolvibile con le intestazioni, dal momento che penso che sia un problema di cache. Qualcuno può spiegare cosa sta succedendo?
Aggiornamento rapido: le intestazioni sembrano risolvere il problema su Firefox, tuttavia persistono su Chrome e iOS Safari (problema con il webkit forse?) –
Sembra un problema di memorizzazione nella cache. Aggiungere un parametro alle richieste GET dinamiche sembra ragionevole - questo è ciò che fa jquery-pjax. –