2011-08-23 20 views
6

Vấn đềbeforeunload điều lạ

Sử dụng $(window).bind("beforeunload", ...[snip] hỏi nếu người dùng muốn rời khỏi trang mang lại một số kết quả kỳ lạ ở một số trình duyệt. Cuộc đối thoại bật lên và hỏi xem bạn có muốn ở lại trang hoặc rời khỏi trang hay không. Nếu bạn nhấp vào tùy chọn ở lại trên trang, Google Chrome (mới nhất - 13.0.782.215 m) và WinIE7 bật trang lịch sử cuối cùng trong nút "Quay lại".

Để minh họa điểm này, lịch sử phiên hiện tại bao gồm quý khách đến thăm trang sau:

  • Trang 3
  • Trang 2
  • Trang 1

Bạn quyết định rời khỏi trang 3 và sự kiện beforeunload kích hoạt. Bạn chọn ở lại trang hiện tại.

Bạn nhấp lại vào nút quay lại và lần này quyết định rời khỏi trang. Bạn sẽ thấy mình ở Trang 2, nhưng thay vào đó bạn đang ở Trang 1. Bạn có thể điều hướng một lần nữa về phía trước.

Câu hỏi

Làm thế nào tôi có thể ngăn chặn các trình duyệt từ loại bỏ những trang này khỏi nút quay lại khi chúng tôi chọn "ở lại trên trang hiện tại" tùy chọn? Có thể không?

Ví dụ về vấn đề

Sử dụng Google Chrome, trong một cửa sổ mới, người đứng đầu để http://stackoverflow.com và duyệt một số câu hỏi mà không đi lại. Sau đó nhấn nút Hỏi câu hỏi. Bắt đầu nhập vào hộp thoại. Nhấn Quay lại trong trình duyệt của bạn. Chọn ở lại trên trang. Nhấn trở lại trong trình duyệt một lần nữa và lần này chọn tùy chọn trang để lại. Bây giờ bạn đã quay lại hai trang trong lịch sử. Về cơ bản, bạn có thể quay lại nhiều trang nếu bạn nhấp vào ở lại trên trang nhiều lần.

Tại sao điều này lại quan trọng ?!

Tôi không muốn gây nhầm lẫn cho người dùng của mình. Họ không phải là loại hiểu biết về máy tính.

Mã của tôi (không phải là nó có liên quan)

$(window).bind("beforeunload", function(){ 
    if (in_edit > 0){ 
     return "You are currently editing this job.\n\nAre you sure you wish to exit the page?"; 
    } 
}); 
+0

Thú vị - Tôi có thể tái sản xuất này trong Chrome 11 (ví dụ) nhưng không phải ở Canary (phiên bản 15). Tôi đoán đây là/là một lỗi, nhưng không thể tìm thấy nó trên http://www.crbug.com. –

+0

Tôi đã có thể tái tạo nó trong Canary. crbug.com id 93858 – dan

+0

Tôi đã thử lại ở Canary lần nữa và lần đầu tiên xung quanh tôi * nghĩ * Tôi đã cố gắng làm cho nó sai, nhưng bây giờ không thể tái tạo: ( –

Trả lời

0

Bạn có thể thử để bao gồm một iframe ẩn vào trang và sau đó trong hàm onbeforeunload thay đổi src trên iframe đó. Điều đó có thể bao gồm một url khác trong lịch sử có thể bị xóa khỏi ngăn xếp lịch sử thay vì trang hiện tại bạn đang truy cập.

Vì vậy, lịch sử trông như thế này:

Page3 
Page2 
Page1 

onbeforeunload thay đổi iframe:

Dummy 
Page3 
Page2 
Page1 

Nhưng đây chỉ là một phỏng đoán rằng có thể làm việc, bạn sẽ cần phải cố gắng này ...