2012-02-25 27 views
6

Tôi đang sử dụng api lịch sử HTML 5 để lưu trạng thái khi yêu cầu ajax xảy ra và tôi cung cấp nội dung html đầy đủ nếu người dùng yêu cầu cùng một trang không có yêu cầu ajax."Mở lại tab đã đóng cuối cùng" để hiển thị nội dung yêu cầu ajax cuối cùng

Tính năng "Đóng lại tab đã đóng cuối cùng" của trình duyệt mang nội dung yêu cầu ajax cuối cùng mà không cần nhấn vào máy chủ. Nếu trình duyệt sẽ yêu cầu mà không mang nội dung yêu cầu cuối cùng thì mọi thứ sẽ hoạt động mà không có vấn đề gì. Nhưng trình duyệt chỉ hiển thị nội dung yêu cầu ajax cuối cùng.

Tôi đã có kinh nghiệm này trên Chrome 17, Firefox 10 (tôi đã không thử nó trên ie9 vì nó không có hỗ trợ lịch sử api)

gì là giải pháp nổi tiếng cho vấn đề này?

Chỉnh sửa: Các yêu cầu ajax này chỉ là "nhận" yêu cầu đến máy chủ.

nó thực sự là không thể chứng minh nó trong jsfiddle.net vì vài lý do. Bạn có thể chứng minh nó trong localhost của bạn như dưới đây.

Đặt "yêu cầu" cho máy chủ và kéo đối tượng json, sau đó đẩy url đó vào lịch sử api như dưới đây.

history.pushState(null,null,url); 

Sau đó đóng tab đó và nhấp vào "Mở lại tab đã đóng cuối cùng" tính năng của trình duyệt của bạn. Bạn thấy gì ? Cơ thể phản ứng của Json? Trình duyệt hiển thị nó mà không yêu cầu máy chủ, phải không?

+0

Bất cứ ai có một ý tưởng? – Freshblood

+1

Bạn có thể đăng một số mã hoặc liên kết đến một trang thể hiện sự cố không? – robertc

+0

@robertc Tôi đã cập nhật câu hỏi và cung cấp thông tin trình diễn. – Freshblood

Trả lời

4

Sự cố đã gây ra bởi tiêu đề phản hồi http. Tiêu đề đã chứa thông tin có thể lưu vào bộ nhớ cache cho các yêu cầu ajax để trình duyệt hiển thị nội dung url đó từ bộ nhớ cache mà không cần nhấn vào cơ sở dữ liệu.

Sau khi xóa thông số bộ nhớ cache khỏi tiêu đề phản hồi thì trình duyệt có thể truy cập máy chủ mà không mang nội dung từ bộ nhớ cache.

0

Tất cả phụ thuộc vào trình duyệt nào bạn đang sử dụng và bật tối ưu hóa nào. Ví dụ:

Google Chrome sẽ giữ trang trong bộ nhớ, vì vậy khi bạn truy cập lại và nó sẽ chuyển đến trang web mới hoặc khi bạn mở lại tab đã đóng - nó sẽ khôi phục trang từ bộ nhớ.

Trình duyệt cũ hơn/chậm hơn sẽ chỉ làm mới mọi thứ.

Mặc dù điều này không thực sự là vấn đề, vì trạng thái javascript của bạn cũng phải được khôi phục - nó phải giống hệt nhau theo mọi cách khi họ mở lại trang đó.

+0

Tôi đang sử dụng phiên bản mới nhất của Chrome và Firefox mà không sửa đổi bất kỳ cài đặt nào. không phải là một vấn đề? Người dùng totaly thấy nội dung yêu cầu ajax cuối cùng là json.Tôi không thể hiển thị cho anh ta trạng thái cuối cùng của trang.Tôi đang sử dụng sammy js đạt được những điều này. – Freshblood

1

Khi bạn mở lại tab đã đóng, trình duyệt được phép sử dụng lại dữ liệu từ bộ nhớ cache cho URL đã cho để điền vào cửa sổ. Vì dữ liệu trong bộ nhớ cache là từ phản hồi yêu cầu ajax, đó là những gì nó sử dụng, và bạn thấy JSON.

Vì vậy, dẫn đến câu hỏi: Tại sao trình duyệt không sử dụng HTML từ bộ nhớ cache khi thỏa mãn yêu cầu ajax? Trình duyệt sử dụng các quy tắc khác nhau để xác định liệu có nên sử dụng nội dung được lưu trong bộ nhớ cache tùy thuộc vào những gì chúng đang thực hiện hay không. Trong trường hợp này, có vẻ như Chrome rất vui khi sử dụng lại nó khi khôi phục tab đã đóng gần đây và không phải khi thực hiện yêu cầu ajax.

Bạn có thể sửa nó bằng cách yêu cầu trình duyệt để không bao giờ lưu bộ nhớ cache phản hồi. Cho dù đó là mong muốn phụ thuộc vào trường hợp sử dụng của bạn.

Ví dụ, chèn những ở trên cùng của tập tin của bạn (sau khi mở thẻ <?php, tất nhiên) làm cho nó không xảy ra đối với tôi:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
Các vấn đề liên quan