2012-08-16 42 views
34

Vấn đề tôi tìm thấy rất giống với this question, ngoại trừ Safari trên máy tính để bàn dường như đã giải quyết được sự cố. Về cơ bản, vấn đề là: khi một khách hàng đang duyệt trên safari di động và trang thực hiện một hàm javascript trên pagea.html, sau đó điều hướng đến pageb.html, sau đó nhấn nút quay lại để quay lại pagea.html, hàm javascript sẽ không chạy khi khách hàng nhấn nút quay lại để quay lại pagea.html. Nó sẽ bỏ qua cuộc gọi javascript.Nút quay lại Mobile Safari

Tôi đã thử các giải pháp được đề cập trong liên kết ở trên, nhưng dường như không có gì hoạt động đối với Safari trên thiết bị di động. Có ai khác đã gặp phải lỗi này không? Làm thế nào bạn có thể xoay xở được?

+2

Bạn có thể thử thêm tất cả các URL liên kết bằng '?' Nếu chưa có. ví dụ: 'href =" next.html "' trở thành 'href =" next.html? "'. Điều này sẽ đưa ra một gợi ý cho trình duyệt web rằng nội dung trang là động và đi đến trang đó một lần nữa nên tải lại trang từ máy chủ một lần nữa. Điều này cũng nên được áp dụng cho các tập lệnh bên ngoài. ví dụ: 'src =" mylib.js "' trở thành 'src =" mylib.js? "'. – Jay

Trả lời

86

Điều này là do back-forward cache. Nó được cho là để lưu trạng thái đầy đủ của trang khi người dùng điều hướng đi. Khi người dùng điều hướng trở lại với trang nút quay lại có thể được tải từ bộ nhớ cache rất nhanh. Điều này khác với bộ nhớ cache thông thường chỉ lưu trữ mã HTML.

Khi trang được tải cho bfcache onload sự kiện sẽ không được kích hoạt. Thay vào đó, bạn có thể kiểm tra thuộc tính persisted của sự kiện onpageshow. Nó được đặt thành false khi tải trang ban đầu. Khi trang được tải từ bfcache nó được đặt thành true.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     alert("From back/forward cache."); 
    } 
}; 

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("From back/forward cache."); 
    } 
}); 

Giải pháp nhanh cho vấn đề này là tải lại trang khi nhấn nút quay lại. Điều này tuy nhiên vô hiệu hóa bất kỳ hiệu ứng tích cực trở lại/chuyển tiếp bộ nhớ cache sẽ cung cấp cho.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() 
    } 
}; 

Là một sidenote, bạn có thể thấy nhiều trang cung cấp sử dụng trống onunload handler làm giải pháp. Điều này đã không hoạt động kể từ iOS5.

$(window).bind("unload", function() { }); 
+3

Cần lưu ý rằng giải pháp này không còn hoạt động trên các phiên bản iOS hiện tại (Tôi tin rằng mình đã đọc ở đâu đó là bất cứ thứ gì ngoài 5 năm). sự kiện pageshow sẽ kích hoạt tính năng quay lại/chuyển tiếp đầu tiên và không bao giờ trở lại trạng thái lịch sử trang đó nữa. Giải pháp khả thi duy nhất tôi đã tìm thấy ngoài đó là sử dụng sự kiện popstate để xác định lùi/tiến. – Shiboe

+1

Đây là trình xử lý onunload trống chưa hoạt động kể từ iOS5. Câu trả lời ở trên hoạt động cho iOS6. Bạn không chắc chắn về iOS7. Sẽ kiểm tra một chút sau. –

+0

Tính năng này hoạt động trên iOS7, nhưng cũng có tác dụng phụ của việc làm mới trang nếu màn hình bị tắt và bật lại. Bất kỳ cách nào để có được xung quanh đó? – Dave4988