window.onbeforeunload và window.onunload không hoạt động trong Firefox, Safari, Opera?


77

Trong ứng dụng trò chuyện của mình, tôi cần nhận được xác nhận từ người dùng khi ứng dụng của tôi đóng.

Vì vậy, tôi đã sử dụng window.onbeforeunloadcảnh báo xác nhận window.onunloadfor và for logout().

  1. Nhưng cả hai chức năng này đều hoạt động trong IE và Chrome. (Ứng dụng hoạt động tốt)

  2. window.onbeforeunload không hoạt động trong Opera và tin nhắn của tôi sẽ không hiển thị trong Firefox.

  3. window.onunload không hoạt động trong Safari, Opera và Firefox.

Mã JavaScript của tôi sẽ là:

// Used for confirmation, to closing the window 
window.onbeforeunload = function () {

    return  "Are you sure want to LOGOUT the session ?";
}; 

// Used to logout the session, when browser window was closed 
window.onunload = function () {

    if((sessionId != null)&&(sessionId!="null")&& (sessionId != ""))
        logout();
};

Tôi cũng đã thử chức năng tương tự với JQuery,

<script type="text/javascript">

    $(window).on('beforeunload', function() {
        return 'Are you sure want to LOGOUT the session ?';
    });

    $(window).unload(function() {
        if ((sessionId != null) && (sessionId != "null") && (sessionId != "")) {
            logout();
        }
    });
    
</script>

Hoạt động trên Firefox của tôi, ngoại trừ tin nhắn không phải là tin bạn đã gửi. jsfiddle.net/yhx6d
Fabrício Matté

Cảm ơn bạn đã trả lời ... Thông báo Yes sẽ không hiển thị.Ngoài ra logout () không hoạt động Điều đó có nghĩa là window.onunload () không hoạt động?
Human Being

window.onbeforeunloadwindow.onunload không hoạt động trong opera?
Human Being

1
Opera không hỗ trợ onbeforeunload và hỗ trợ của nó onunloadkhông đầy đủ.
Marcel Korpel

1
vui lòng kiểm tra stackoverflow.com/questions/5548505/… để biết vấn đề về firefox
my motherland

Câu trả lời:


93

Rất tiếc, các phương pháp bạn đang sử dụng không được hỗ trợ trong các trình duyệt đó. Để hỗ trợ câu trả lời của tôi (hành vi không ủng hộ này), tôi đã đưa ra các liên kết bên dưới.

onbeforeunloadonunloadkhông làm việc trong opera... để hỗ trợ điều này

onbeforeunload trong Opera
http://www.zachleat.com/web/dont-let-the-door-hit-you-onunload-and-onbeforeunload/

Mặc dù onunloadsự kiện không hoạt động hoàn toàn, bạn có thể sử dụng onunloadđể hiển thị cảnh báo nếu người dùng nhấp vào liên kết để điều hướng khỏi trang có biểu mẫu chưa được lưu.

onunloadkhông hoạt động trong safari... để hỗ trợ điều này

https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

Bạn có thể thử sử dụng pagehidesự kiện trong trình duyệt safari thay cho onunload.

onunloadkhông hoạt động trong firefox... để hỗ trợ điều này

https://bugzilla.mozilla.org/show_bug.cgi?id=681636

Họ cũng chưa đưa ra giải pháp trong FF

Chúc bạn may mắn cổ vũ.


40
Tôi đã tặng +50 tiền thưởng cho bạn, vì bạn đã làm việc rất nhiều để có được câu trả lời gợi ý này. Và nó sẽ giúp ích cho các câu hỏi khác.
Con người

3
Bất cứ cập nhật ? vẫn không được hỗ trợ ?, bất kỳ cách giải quyết nào?
Francisco Corrales Morales

Liên kết bạn đã chia sẻ để hỗ trợ câu lệnh onunloadkhông hoạt động trong firefox, chỉ có nghĩa là khi trang chỉ ở trong tình huống bật lên. "window.onUnload không hoạt động khi trang được trong một popup"
Nick Rolando

43

Đây là giải pháp làm việc cho firefox và chrome:

var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable

            myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
                var confirmationMessage = 'Are you sure to leave the page?';  // a space
                (e || window.event).returnValue = confirmationMessage;
                return confirmationMessage;
            });

@ user3253009. làm thế nào để bạn tìm thấy câu trả lời ở đây?
KumarHarsh

Phản hồi nào @KumarHarsh?
faisale

@ user3253009, khi cửa sổ bật lên xuất hiện với "Ở lại trang" hoặc "Rời khỏi trang" thì chúng tôi có thể bắt được phản hồi cho dù người dùng có nhấp vào nút nào không.
KumarHarsh

không @KumarHarsh, bạn không thể bắt được phản hồi, đó là hành vi của trình duyệt, bạn có thể ở lại hoặc rời khỏi trang.
faisale

2
@ user3253009, tuyệt vời! Nhưng có vẻ như nó không hoạt động trên safari trên iPhone. Bất kỳ giải pháp khả thi nào cho điều này?
user2335065,

17

Tôi đã có thể làm cho nó hoạt động trong IE và FF với jQuery's:

$(window).bind('beforeunload', function(){

});

thay vì: dỡ xuống, tải lên hoặc tải lên trước


@JavaPlayer Nó có vẻ hoạt động với tôi trong firefox 26.x ... Bạn đã tìm các lỗi javascript khác chưa. Nó tiếp tục làm việc cho tôi.
nathan hayfield

@nathanhayfield Điều này đang hoạt động tốt, nhưng có một cửa sổ bật lên. Làm thế nào tôi có thể bỏ qua điều đó?
WP Learner

@nathanhayfield Tôi cũng đã thử và có một cảnh báo để xác nhận. Tại sao nó được hiển thị? không có cảnh báo trong chức năng của tôi / code
WP Học

14

Tôi đã nhận được giải pháp cho onunloadtất cả các trình duyệt ngoại trừ Opera bằng cách thay đổi yêu cầu không đồng bộ Ajax thành yêu cầu đồng bộ.

xmlhttp.open("POST","LogoutAction",false);

Nó hoạt động tốt cho tất cả các trình duyệt ngoại trừ Opera .


nó hoạt động trong firefox, nhưng tiếc là MDN nói của nó được cho là bị phản đối
Oldboy

6

Sự kiện onunload không được gọi trong tất cả các trình duyệt. Tệ hơn, bạn không thể kiểm tra giá trị trả về của sự kiện onbeforeunload. Điều đó ngăn chúng tôi thực sự định dạng trước một chức năng đăng xuất.

Tuy nhiên, bạn có thể hack xung quanh điều này.

Gọi đăng xuất điều đầu tiên trong sự kiện onbeforeunload. sau đó nhắc người dùng. Nếu người dùng hủy đăng xuất, hãy tự động đăng nhập lại bằng cách sử dụng sự kiện onfocus. Kinda ngược, nhưng tôi nghĩ nó sẽ hoạt động.

'use strict';

var reconnect = false;

window.onfocus = function () {
  if (reconnect) {
    reconnect = false;
    alert("Perform an auto-login here!");
  }
};

window.onbeforeunload = function () {
  //logout();
  var msg = "Are you sure you want to leave?";
  reconnect = true;
  return msg;
};

3
Có vẻ như một điều rất không an toàn để làm. Để có thể tự động đăng nhập lại người dùng, thông tin đăng nhập phải được lưu trữ trong trình duyệt, về cơ bản cho phép người dùng đã đăng xuất có thể đăng nhập bởi bất kỳ ai.
Niclas

2

Firefox đơn giản là không hiển thị các thông báo onbeforeunload tùy chỉnh. Mozilla cho biết họ đang bảo vệ người dùng cuối khỏi các trang web độc hại có thể hiển thị văn bản gây hiểu lầm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.