tl; dr - Safari trên iOS 5 đang lưu vào bộ nhớ cache rất khó, nó đang phá vỡ trang web của tôi.Sự cố với Bộ nhớ cache trang trong iOS 5 Safari khi điều hướng trở lại/dỡ sự kiện không được kích hoạt
Tôi đang vật lộn với cách trình duyệt Safari trong iOS 5 đề cập đến bộ đệm ẩn tiến về phía trước, mà chúng gọi là "Bộ nhớ trang". Cách nó được mô tả here giải thích hành vi rất tốt.
Rất đơn giản, trang Cache làm cho nó vì vậy khi bạn rời khỏi một trang chúng tôi “tạm dừng” nó và khi bạn quay trở lại chúng tôi nhấn “play”.
này đang gây ra những vấn đề xuyên suốt trang web của tôi. Khi sử dụng nút quay lại, hầu hết các trình duyệt khác sẽ hiển thị cho bạn trang ở trạng thái được tải. Không phải Safari trên iOS 5, nó cho bạn thấy trang như bạn cuối cùng còn lại nó. Một ví dụ đơn giản là vô hiệu hóa nút gửi. Nếu tôi sử dụng Javascript để vô hiệu hóa nút gửi, sau đó gửi biểu mẫu, khi bạn nhấp vào nút gửi vẫn sẽ bị tắt. Đây là một vấn đề trong các trình duyệt khác, bao gồm phiên bản Safari dành cho máy tính để bàn, nhưng nó được giải quyết bằng cách đặt trình xử lý sự kiện onload thành một hàm trống. Tôi tin rằng điều này cho trình duyệt để làm mất hiệu lực bộ nhớ cache vì một cái gì đó quan trọng có thể đã xảy ra trong chức năng đó. Bản hack này dường như không hoạt động đối với Safari trên iOS 5.
Dưới đây là vấn đề được giải quyết cho các yếu tố cần thiết. Khi bạn tải test.html, bạn sẽ thấy văn bản "Văn bản gốc". Khi bạn nhấp vào liên kết, văn bản đó sẽ thay đổi thành "Văn bản đã thay đổi - chuyển tiếp đến trang tiếp theo", sau đó trong 3 giây, bạn sẽ được chuyển tiếp đến test2.html. Tất cả đều tốt cho đến thời điểm này trong tất cả các trình duyệt. Trong tất cả các trình duyệt khác, khi bạn nhấp vào nút quay lại, văn bản bạn sẽ thấy là "Văn bản gốc", nhưng trên Safari cho iOS 5, bạn sẽ thấy "Thay đổi văn bản - chuyển tiếp tới trang tiếp theo".
Bất kỳ đề xuất nào về cách giải quyết vấn đề này?
Đây là một ví dụ đơn giản
test.html
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
test2.html
<div>Click back button</div>
Đây là một ví dụ thứ hai sử dụng một bài mẫu. Đây là một ví dụ đơn giản về cách ứng dụng của tôi hoạt động. Khi bạn điều hướng trở lại formtest2.asp, bạn sẽ thấy giá trị biểu mẫu đã đăng và văn bản div phải là bản gốc.
formtest.asp
<form method="post" action="formtest2.asp">
Test: <input type="text" name="test"/>
<input type="submit" value="Submit"/>
</form>
formtest2.asp
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<%
Dim test
test = Request("test")
Response.Write("Test value: " & test & "<br />")
%>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
test2.html
<div>Click back button</div>
Chỉ cần thêm một chút thông tin về việc này. Dường như tất cả các trình duyệt mà tôi đã thử nghiệm (Firefox, IE, Safari Desktop) đang kích hoạt pagehide, và dỡ bỏ, theo thứ tự đó. Safari trên iOS 5 chỉ kích hoạt pagehide. – Clarke
Khi mở một tab mới, sự kiện unload không được kích hoạt, chỉ cần pagehide. Khi mở một tab mới, bạn sẽ có thể điều hướng trở lại một tab cũ và xem trang giống như bạn đã rời khỏi nó. Vấn đề là khi chúng ta điều hướng từ một trang đến trang tiếp theo trong cùng một tab/cửa sổ, sự kiện dỡ bỏ sẽ được kích hoạt trên mỗi w3c nhưng không phải. http://www.w3.org/TR/DOM-Level-2-Events/events.html. "Sự kiện unload xảy ra khi triển khai DOM xóa tài liệu khỏi cửa sổ hoặc khung. Sự kiện này hợp lệ đối với các phần tử BODY và FRAMESET." – Clarke
Bất kỳ giải pháp nào bằng cách sử dụng location.reload() không thành công vì đối với hàm này, Safari trên ios 5 sẽ chỉ thực hiện GET, không phải là POST giống như tất cả các trình duyệt khác. – Clarke