2009-08-05 9 views
9

Próbuję polegać na pamięci podręcznej przeglądarki, aby przechowywać dane JSON zwrócone z wywołań AJAX w jQuery.Czy przeglądarka nie może używać swojej pamięci podręcznej z poprzednich wywołań ajax?

Normalna aktywność przeglądarki zależy od pamięci podręcznej przeglądarki przez cały czas. Przykład: obrazy jpg i gif nie są ponownie rysowane po przeładowaniu strony.

Ale kiedy próbuję używać wywołań ajax jQuery getJSON ajax, nie mogę uniknąć pobierania danych z serwera.

Moi zwracane nagłówki wyglądać następująco (potwierdzone Firebug):

Transfer-Encoding: chunked 
Date: Wed, 05 Aug 2009 02:55:39 GMT 
Content-Type: text/plain; charset=ISO-8859-1 
Expires: Wed, 05 Aug 2009 03:55:39 GMT 
Cache-Control: max-age=3600 

Jednak natychmiastowe odświeżenie strony powoduje identyczne żądania, aby uderzyć serwer.

Widziałem kilka wpisów dotyczących unikania zachowań pamięci podręcznej, które nie są tym, czego potrzebuję. Widziałem kilka postów na temat korzystania z buforowania, ale wszystkie one polegają po zapisaniu danych w DOM. Chcę coś, co zachowuje się tak, jak robią obrazy w pamięci podręcznej podczas przeładowania strony.

Cant przeglądarki po prostu pobrać go z własnej pamięci podręcznej?

--x - x - x - x UPDATE --x - x - X--

Ku mojemu rozczarowaniu, kilka szacowni ludzie zgadzają się, że nie jest to tylko możliwe. Niektórzy twierdzą nawet, że nie powinno to być (co wciąż mnie niepokoi).

Stubburn do winy, próbowałem następujące:

ustawić nagłówek wytycznych na wszystkich stronach wychodzących Chcę być buforowane (wybiorę kilka argumentów wybór URL, które reprezentują dane i jestem z prośbą po prostu użyj tego dla wartości Etag)

Na początku następnego wniosku, po prostu sprawdzam, czy w zapytaniu znajduje się nagłówek "If-None-Match". Jeśli tak, to przeglądarka nie buforuje żądania tak, jak chciałem, więc wysłałem odpowiedź 304 niezmodyfikowaną.

Badanie pokazuje, że Firefox nie będzie buforować moją prośbę (ale nadal mogę uniknąć „sprowadzić drogie dane” część mojego CGI), podczas gdy IE6 rzeczywiście buforować go (i przyzwyczajenie nawet próbować ściągam z powrotem serwer).

To nie jest ładna odpowiedź, ale na razie działa dla mnie
(te odświeżające pełne strony odświeżenia danych wykresowych nie będą teraz tak powolne i drogie).

(Co? Używam IE6! OMG! Oh wyglądać wiewiórkę!)

+0

może trzeba użyć if-Modified-Since żądań HTTP przekonwertować te do 304 kodów stanu? – ericslaw

+0

darn, nawet nagłówki "if-modified-since" są wysyłane na żądanie ... tak bardzo na 304 podejście – ericslaw

+0

Miałem trochę szczęścia z ustawieniem Etag na początkowej prośbie i zwróceniem 304, jeśli istnieje nagłówek "If-None-Match" później wnioski. – ericslaw

Odpowiedz

0

Chociaż nie „Pamięć podręczna przeglądarki” co o stanie sesji lub innej postaci oszczędności po stronie klienta. Nadal będziesz musiał zajrzeć do zmodyfikowanej od czasu sytuacji, o której mowa w twoim komentarzu.

Przeglądarka nie będzie natywnie wiedzieć, czy dane zostały zmienione, czy nie, ponieważ json pobierał dynamicznie, a zawartość pamięci podręcznej jest statyczna. Myślę?

1

Krótka odpowiedź brzmi: nie. Niestety przeglądarki nie przechwytują żądań AJAX w niezawodny sposób w taki sam sposób, w jaki robią "normalne" strony.(Chociaż dane mogą być w rzeczywistości przechowywane w pamięci podręcznej, przeglądarka często nie używa pamięci podręcznej, gdy obsługuje żądania AJAX w sposób oczekiwany.) To powinno się zmienić w przyszłości, ale na razie trzeba to obejść .

+1

Tak. W najlepszym wypadku jest niespójne. Czasami robią, kiedy najmniej się tego spodziewasz. – jason

1

Możesz chcieć sprawdzić swoje zasoby za pomocą Resource Expert Droid, aby upewnić się, że robią to, co chcesz. Powinieneś również uruchomić śledzenie sieci, aby dokładnie sprawdzić nagłówki żądań i odpowiedzi, używając czegoś takiego, jak Wireshark, na wypadek, gdyby Firebug nie opowiedział całej historii.

Możliwe, że jQuery zawiera nagłówki żądań w sposób, który według przeglądarki powinien ominąć pamięć podręczną. Czy próbowałeś zwykły XMLHTTPRequest bez ramy?

+0

strona internetowa nie jest publiczna, więc nie można używać redbota, ale dzięki. wireshark pokazuje te same nagłówki niż pokazy firebug. Nie próbowałem bezpośrednio XMLHTTPRequest (wskaźnik do tego jak to zrobić?) – ericslaw

+0

Klasyczne odwołanie XMLHTTPRequest: http://developer.apple.com/internet/webcontent/xmlhttpreq.html Jeśli jesteś naprawdę zainteresowany, możesz można zainstalować lokalnie redbota. – Carey

Powiązane problemy