Um die Leistung/Reaktionszeit meiner Website zu verbessern, habe ich eine teilweise Seitenladung mit AJAX, replaceState, pushState und einem Popstate Listener implementiert.HTML5 History API Zurück-Schaltfläche mit partiellen Seitenlasten
Ich im Wesentlichen den zentralen Teil meiner Seite (HTML) als mein Statusobjekt in der Geschichte speichern. Wenn ein Link angeklickt wird, fordere ich nur das zentrale Bit der Seite vom Server an (indem ich diese Anfragen mit einem anderen Accept-Header identifiziere) und ersetze ihn durch Javascript. Bei popstate greife ich den vorherigen zentralen Teil und schiebe ihn zurück in den Dom.
Das funktioniert meistens gut, aber ich habe ein bestimmtes Problem gefunden, auf dem ich feststecke. Es ist ein wenig kompliziert zu erklären, daher entschuldige ich mich, wenn das nicht sehr klar ist.
Auf den meisten Seiten gibt es ein Suchformular. Das partielle Laden von Seiten über AJAX erfolgt nur bei GET-Anforderungen, und das Formular führt einen POST aus, der zu einer vollständigen Seitenladung führt.
Wenn ich den folgenden Satz von Seiten navigieren, hat ich am Ende auf einer fehlerhaften Teil-Seite nach oben aus NUR der zentralen Inhalt, ohne von dem umgebenden dom:
startet auf der Startseite (über ganze Seite Last) - eine Suche (post-Redirect-get)
Springt Ergebnisse (über volle Seite laden suchen) - dann Startseite
Returns klicken Sie auf die Homepage (über dynamische get) - klicken Browser zurück
Suche Ergebnisse (von Popstate Listener) - klicken Sie auf Browser zurück
Malformed home pag e.
Wenn die fehlerhafte Homepage angezeigt wird, ist mein Popstate-Listener überhaupt nicht vorhanden.
Was ich denke, geschieht, ist, dass die zweite Ladung (dynamisch, teilweise) der Homepage vom Browser zwischengespeichert wird, und dann, wenn die ganze Seite zurück auftritt, zeigt der Browser nur die zwischengespeicherte partielle Antwort statt die ganze Seite.
Um dies zu beheben, habe ich einen Vary: Accept-Header zur Antwort hinzugefügt, damit die Browser wissen, dass sich der Inhalt basierend auf dem Accept-Header ändern kann. Ich habe auch Cache-Control max-age = 0, Pragma no-cache und ein Ablaufdatum der letzten Zeit zu dem teilweise geladenen Inhalt hinzugefügt, um zu versuchen, den Browser zu zwingen, dies nicht zu cachen, aber nichts davon löst es.
Leider erlaubt meine Firma keinen externen Datenverkehr zu unseren Dev-Servern, daher kann ich Ihnen das Problem nicht zeigen. Ich habe mir hier verschiedene ähnliche Fragen angeschaut, aber keine von ihnen scheint gleich zu sein, und auch die vorgeschlagenen Lösungen scheinen nicht zu funktionieren.
Wenn ich meinen dynamischen GET-Anfragen einen sinnlosen Parameter (blah = blah) hinzufüge, löst dies das Problem. Aber das ist ein hässlicher Hack, den ich lieber nicht machen würde. Dies scheint so zu sein, dass es mit Headers lösbar sein sollte, da ich denke, dass es ein Caching-Problem ist. Kann mir jemand erklären, was vor sich geht?
Quick update - die Header scheinen das Problem in Firefox zu lösen, bestehen aber auf Chrome und iOS Safari (Webkit-Problem vielleicht?) –
Es klingt wie ein Caching-Problem. Das Hinzufügen eines Parameters zu den dynamischen GET-Anfragen erscheint sinnvoll - das ist es, was jquery-pjax tut. –