2012-04-11 23 views
12

Tôi có xử lý như sau:'pageshow' không được nhận khi nhấn nút "back" trên trình duyệt Safari trên * IPad"

 $(window).bind('pageshow', function() { alert("back to page"); }); 

Khi tôi di chuyển ra khỏi trang (bằng cách nhấn vào một liên kết) và lợi nhuận trở lại trang (bằng cách nhấn vào "trở lại" nút), các alert() không được gọi (IPad 2, iOS 5.1).

tôi đang làm gì sai xin vui lòng? Bất kỳ sự kiện khác tôi cần phải liên kết với?

PS: thú vị rằng pagehide được nhận đúng khi điều hướng khỏi trang.

Trả lời

4

Những gì bạn đang làm ở đó sẽ ràng buộc giá trị trả lại là alert("back to page") làm gọi lại. Điều đó sẽ không hoạt động. Bạn cần phải ràng buộc một hàm thay thế:

$(window).bind('pageshow', function() { alert("back to page"); }); 
+0

xin lỗi, cảm ơn vì đã sửa - cũng không thử thành công (thực tế, ví dụ về nhà của tôi bao gồm chức năng gọi lại, không phải cuộc gọi thực tế). câu hỏi chính đã được chỉnh sửa. – BreakPhreak

+0

Cuối cùng, một cái gì đó đã làm việc cho nút iPhone Safari back. Cảm ơn. – lox

+0

Đây là thông tin chi tiết có giá trị. Cảm ơn bạn. – jfroom

6

Đây có thể là vấn đề về bộ nhớ đệm. Khi bạn quay lại trang thông qua nút "quay lại", trang đang được lấy từ bộ nhớ cache (hành vi phụ thuộc vào trình duyệt). Vì điều này, JS của bạn sẽ không kích hoạt vì trang đã được hiển thị trong bộ nhớ cache và chạy lại js của bạn có thể gây bất lợi cho bố cục và như vậy.

Bạn sẽ có thể khắc phục điều này bằng cách tinh chỉnh tiêu đề bộ nhớ đệm trong phản hồi hoặc sử dụng một số thủ thuật trình duyệt.

Dưới đây là một số liên kết về vấn đề này:

EDIT

Đây là tất cả kéo từ các liên kết ở trên:

  • history.navigationMode = 'compatible';
  • <body onunload=""><!-- This does the trick -->
  • "Firefox 1.5+ và một số phiên bản tiếp theo của trình duyệt Safari (trong đó có việc sửa chữa cho lỗi 28.758) hỗ trợ sự kiện đặc biệt được gọi là pageshowpagehide."
  • Sử dụng jQuery $(document).ready(handler)
  • window.onunload = function(){};
+0

Cảm ơn. Tôi đã nghi ngờ rằng nó xảy ra vì các vấn đề bộ nhớ đệm. Ngoài ra, NẾU tôi là đúng - các * pageload * và * pagehide * chỉ là "thủ thuật" được cho là để làm công việc (nhưng họ dường như không làm việc), bạn có thể xin cụ thể hơn về thủ thuật khác tôi don không biết? Ah, và tôi không thể sửa đổi các tiêu đề bộ nhớ đệm trong trường hợp của tôi. – BreakPhreak

+0

@BreakPhreak - xem chỉnh sửa của tôi. –

8

Bạn có thể kiểm tra persisted tài sản của sự kiện pageshow. Nó được đặt thành false khi tải trang ban đầu. Khi trang được tải từ bộ nhớ cache, nó được đặt thành true.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     alert("back to page"); 
    } 
}; 

Vì một lý do nào đó jQuery không có thuộc tính này trong sự kiện. Bạn có thể tìm thấy nó từ sự kiện ban đầu.

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     alert("back to page"); 
    } 
}; 
+3

Có vẻ như đây là câu trả lời đúng, nhưng các trình duyệt tôi đã thử (Safari 7 và Firefox 26 trên Mac OS 10.9) không bao giờ được đặt thành đúng, mặc dù chúng không thực sự tải lại từ máy chủ. (Tại thời điểm này tôi thậm chí không sẵn sàng tin tưởng các công cụ phát triển của riêng mình, vì vậy tôi đã sử dụng Wireshark để xác minh. Tôi đang gửi tiêu đề kiểm soát bộ nhớ cache để tạo trang không thể lưu vào bộ nhớ cache và Safari tuyên bố không sử dụng bộ nhớ cache, nhưng Wireshark không hiển thị lưu lượng truy cập đến máy chủ khi tôi nhấp vào Quay lại.) – giskard22

+0

Đã có sự thay đổi trong Safari 7 sau đó. Chỉ cần kiểm tra và event.persisted được đặt thành true trong Safari 6. –

+1

Dường như onpageshow sự kiện không kích hoạt gì cả với 6.1.1. khi nhấp vào nút quay lại ... –

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