2009-08-05 31 views
9

Tôi đang cố gắng dựa vào bộ nhớ cache của trình duyệt để giữ dữ liệu JSON được trả lại từ các cuộc gọi AJAX trong jQuery.Không thể trình duyệt chỉ sử dụng bộ nhớ cache từ các cuộc gọi ajax trước đó?

Hoạt động trình duyệt thông thường dựa trên bộ nhớ cache của trình duyệt mọi lúc. Ví dụ: hình ảnh jpg và gif không được tải lại khi tải lại trang.

Nhưng khi tôi thử sử dụng các cuộc gọi jQuery getJSON ajax, tôi dường như không thể tránh tìm nạp dữ liệu từ máy chủ.

tiêu đề trở lại của tôi trông như thế này (xác nhận với 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 

Tuy nhiên, một quá trình refresh ngay lập tức của trang gây yêu cầu giống hệt nhau để đạt máy chủ.

Tôi đã xem một số thông tin đăng về cách tránh hành vi lưu vào bộ nhớ cache, đó không phải là những gì tôi cần. Tôi đã nhìn thấy một số thông tin đăng về việc sử dụng bộ nhớ đệm, nhưng tất cả những điều đó dường như đều dựa vào khi lưu dữ liệu trong DOM. Tôi muốn một cái gì đó mà cư xử giống như hình ảnh được lưu trữ trong khi tải lại trang.

Không thể trình duyệt tìm nạp từ bộ nhớ cache của chính nó?

--x - x - x - x CẬP NHẬT --x - x - x--

nhiều đến sự thất vọng của tôi, một số folks kính đồng ý rằng đây không chỉ là có thể. Một số thậm chí còn cho rằng nó không nên (mà vẫn còn cản trở tôi).

Stubburn đến một lỗi, tôi thử như sau:

tôi đặt tiêu đề ETag trên tất cả các trang đi Tôi muốn được lưu trữ (Tôi chọn một vài đối số URL lựa chọn đại diện cho dữ liệu tôi đang yêu cầu và chỉ sử dụng giá trị Etag đó)

Khi bắt đầu yêu cầu tiếp theo, tôi chỉ cần kiểm tra xem tiêu đề 'Nếu không có khớp' có trong yêu cầu không. Nếu vậy, trình duyệt sẽ không lưu vào bộ nhớ cache yêu cầu như tôi muốn, vì vậy tôi đã gửi phản hồi 304 Không được sửa đổi.

Thử nghiệm cho thấy Firefox sẽ không lưu trữ yêu cầu của tôi (nhưng tôi vẫn có thể tránh phần 'tìm nạp dữ liệu đắt tiền'), trong khi IE6 thực sự lưu bộ nhớ cache (và thậm chí không tìm nạp lại từ máy chủ).

Nó không phải là một câu trả lời hay, nhưng nó làm việc cho tôi bây giờ
(những trang làm mới đầy đủ của dữ liệu đồ thị sẽ không quá chậm hoặc đắt tiền bây giờ).

(gì? Tôi đang chạy IE6! OMG! Oh nhìn một con sóc!)

+0

có lẽ tôi cần phải sử dụng if-Modified-Since yêu cầu phải chuyển đổi những HTTP 304 mã trạng thái? – ericslaw

+0

darn, thậm chí không phải 'nếu được sửa đổi từ' tiêu đề được gửi theo yêu cầu ... rất nhiều cho 304 phương pháp tiếp cận – ericslaw

+0

Tôi đã có một số may mắn với thiết lập Etag theo yêu cầu ban đầu và trở về 304 nếu tiêu đề 'If-None-Match' tồn tại trên yêu cầu sau này. – ericslaw

Trả lời

0

Trong khi không phải là "trình duyệt bộ nhớ cache" những gì về trạng thái phiên hoặc một số hình thức khác của tiết kiệm phía khách hàng. Bạn sẽ vẫn phải xem xét nếu một sửa đổi kể từ khi tình hình như đã đề cập trong bình luận của bạn.

Trình duyệt sẽ không biết nguyên bản liệu dữ liệu đã được thay đổi hay không vì json đã truy xuất động và nội dung trong bộ nhớ cache tĩnh. Tôi nghĩ?

1

Câu trả lời ngắn gọn là không. Thật không may, các trình duyệt không đáng tin cậy lưu trữ các yêu cầu AJAX theo cùng một cách mà chúng làm các trang "bình thường".(Mặc dù dữ liệu có thể thực tế là được lưu trong bộ nhớ cache, trình duyệt thường không sử dụng sử dụng bộ nhớ cache khi xử lý yêu cầu AJAX theo cách bạn mong đợi.) Điều này sẽ thay đổi trong tương lai, nhưng bây giờ bạn phải làm việc .

+1

Vâng. Nó không phù hợp nhất. Đôi khi họ làm khi bạn ít mong đợi nó nhất. – jason

1

Bạn có thể muốn kiểm tra tài nguyên của mình bằng cách sử dụng Resource Expert Droid để đảm bảo chúng đang thực hiện những gì bạn định làm. Bạn cũng nên chạy theo dõi mạng để kiểm tra kỹ yêu cầu và tiêu đề phản hồi bằng cách sử dụng một cái gì đó như Wireshark, trong trường hợp Firebug không kể toàn bộ câu chuyện.

Có thể jQuery bao gồm một số tiêu đề yêu cầu theo cách mà trình duyệt quyết định sẽ bỏ qua bộ nhớ cache. Bạn đã thử một đơn giản XMLHTTPRequest mà không có khuôn khổ chưa?

+0

trang web không công khai, vì vậy không thể sử dụng redbot, nhưng cảm ơn. wireshark hiển thị các tiêu đề giống với các chương trình firebug. Tôi đã không cố gắng XMLHTTPRequest trực tiếp (con trỏ đến một làm thế nào để cho rằng?) – ericslaw

+0

Các tài liệu tham khảo XMLHTTPRequest cổ điển: http://developer.apple.com/internet/webcontent/xmlhttpreq.html Nếu bạn thực sự quan tâm, bạn có thể cài đặt redbot cục bộ. – Carey

Các vấn đề liên quan