2010-09-23 28 views
18

Vì vậy, tôi muốn lưu trữ một số thông tin trong localstorage của trình duyệt khi trang được làm mới hoặc người dùng thoát khỏi trang để sử dụng trong tương lai. Tôi figured rằng tôi muốn sử dụng một số Javascript để phát hiện sự kiện và lưu trữ trạng thái của trang truy cập.Câu hỏi JavaScript: Onbeforeunload hoặc Onunload?

Hiện tại, tình trạng khó khăn của tôi là: tôi có nên sử dụng phương pháp Onbeforeunload hoặc Onunload để thực hiện mục tiêu này không?

Cảm ơn

+0

xem hỗ trợ trình duyệt của 'onbeforeunload' WindowEventHandler trên https://developer.mozilla.org/en-US/docs/WindowEventHandlers.onbeforeunload#Browser_compatibility –

+0

xem hỗ trợ trình duyệt của 'onunload' WindowEventHandler trên https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers.onunload#Browser_compatibility (Lưu ý rằng các phiên bản trình duyệt không được chỉ định trong doc tho này) –

+0

http://stackoverflow.com/questions/158673/onbeforeunload-support-detection –

Trả lời

20

Tại sao không đăng ký với cả hai chỉ để được ở bên an toàn? Chỉ cần người nghe thực hiện kiểm tra để xem dữ liệu được lưu trữ chưa và thoát sớm.

Dưới đây là một ví dụ nhanh sử dụng thuộc tính sự kiện:

window.onunload = window.onbeforeunload = (function(){ 

    var didMyThingYet=false; 

    return function(){ 
    if (didMyThingYet) return; 
    didMyThingYet=true; 
    // do your thing here... 
    } 

}()); 

Hoặc bạn có thể sử dụng attachEvent:

(function(){ 

    var didMyThingYet=false; 

    function listener(){ 
    if (didMyThingYet) return; 
    didMyThingYet=true; 
    // do your thing here... 
    } 

    window.attachEvent("onbeforeunload", listener); 
    window.attachEvent("onunload", listener);  

}()); 
+1

Điều đó nghe như một ý tưởng có thể thực hiện để bao quát tất cả các căn cứ. Nó sẽ là tuyệt vời nếu bạn có thể chỉ cho tôi một đoạn trích hoặc một nguồn lực như xa như người nghe sự kiện và thoát sớm đi. – pratyk

+0

cảm ơn cho đoạn mã. Tôi đã thử nó trên các cửa sổ và mac os chrome/firefox và nó dường như bao gồm tất cả các căn cứ. Một thử nghiệm nhỏ hơn cho Opera và IE9 beta sẽ giúp tôi chạy. – pratyk

0

Tôi tin rằng Onbeforeunload là cược an toàn. Có thể trình duyệt không thực thi tập lệnh onunload hoàn toàn - ví dụ, nếu bạn có cảnh báo trong onunload, chrome sẽ không hiển thị nếu bạn đóng cửa sổ.

+3

Tôi đã thử nghiệm Chrome phiên bản 5 và 6 trên Mac OS X và nó cảnh báo trên OnUnload. Tôi ước có một ma trận/biểu đồ liệt kê sự hỗ trợ DOM cho mỗi trình duyệt. Cảm ơn. – pratyk

8

Nơi thích hợp để làm điều đó là onunload. onbeforenload có nghĩa là được sử dụng khi bạn có thể cần phải ngăn chặn người dùng rời khỏi trang, như khi có dữ liệu chưa lưu.

Tôi sẽ rất mệt mỏi khi viết mã để bao trả tất cả các trường hợp vì bạn không sẵn sàng kiểm tra tất cả các trường hợp. Nếu bạn nghiên cứu và thấy rằng nó quá phức tạp trên các trình duyệt, vâng, hãy tiếp tục và làm nhiều nhất có thể. Tuy nhiên, tôi tin rằng không có vấn đề gì khi thực hiện lưu trữ cục bộ. Tôi thực sự đã chạy vào một vấn đề, cố gắng gửi thông tin đến máy chủ onunload. Điều đó đã không xảy ra đáng tin cậy trên các trình duyệt vì vậy tôi đã kết thúc với một cách tiếp cận sử dụng cả dỡ hàng và tải trước, nhưng chỉ sau khi cần sự thẩm định.

Vì vậy, đề xuất của tôi là làm điều đó onunload, kiểm tra tất cả các trình duyệt của bạn.

+0

1 Thử nó với cả hai và Chrome đặt ra một hộp thoại xấu xí với 'onbeforeunload' nếu bạn gọi 'indexedDB.deleteDatabase' bên trong của nó, nhưng nó là hạnh phúc để làm cuộc gọi cùng một bên' onunload'. –

0

Từ kinh nghiệm của tôi: sử dụng onunload vì Opera không hỗ trợ sự kiện khác. Vâng, tôi biết ... Opera ... nhưng vẫn còn :)

+0

Cập nhật: Opera sử dụng V8 ngay bây giờ :) –