2012-06-15 19 views
7

Ho riscontrato uno strano bug in Chrome 19. Ho implementato un sito Web completo AJAX (ogni collegamento non esterno è aperto tramite richiesta AJAX) con il supporto pushState. Trasmetto i frammenti HTML in AJAX tramite il formato JSON.Errore Ajax + pushState in Chrome

Quando esco dal mio sito tramite un collegamento esterno e poi torno indietro, Chrome esegue il rendering dei dati memorizzati nella cache per quell'URL: il problema è che memorizza nella cache il contenuto JSON e lo mostra invece della pagina Web completa.

Questo è riproducibile da questi passaggi (UPDATE: Ho rimosso la funzionalità AJAX sul mio sito da allora, in modo da questo bug non fa più apparire):

  1. Aprire http://beta.mirtes.cz/
  2. Cliccare sulla seconda data link (16. 6. 2012 accanto a "Tutto è iniziato con una strana e-mail"). Questa pagina (che ora si trova a http://beta.mirtes.cz/it-all-began-with-a-strange-e-mail) viene caricata tramite AJAX.
  3. Fare clic su "Tutto è iniziato con una strana e-mail". Sei reindirizzato a un sito Web esterno.
  4. Fare clic su "Indietro" in Chrome dopo che la pagina è stata caricata completamente.

Provo a inviare tutte le risposte AJAX con Cache-Control: no-cache, ma senza alcun effetto.

Firefox 12 funziona correttamente.

risposta

7

Sono arrivato con una soluzione alternativa: eseguo la richiesta AJAX con un ulteriore parametro fittizio GET -? Ajax = 1. In questo modo il browser può riconoscere la differenza tra il solito contenuto HTML e JSON. Non ha alcun impatto sull'utente, il parametro è visibile solo in Firebug.

+0

Puoi spiegare un po 'di più cosa hai fatto e come è stato risolto il problema? – Ryan

+0

Sto facendo tutte le richieste AJAX con un ulteriore parametro GET - in questo caso, ajax = 1. Questo parametro è invisibile all'utente, perché viene eseguito solo in background. –

+0

In questo modo, il browser può conoscere la differenza tra il contenuto HTML completo e il contenuto JSON AJAX perché gli URL sono diversi. E quindi non mostra il contenuto JSON memorizzato nella cache dove non dovrebbe. Puoi controllare la funzionalità sulla mia homepage su http://ondrej.mirtes.cz/. –