79

在我的聊天应用程序中,当我的应用程序关闭时,我需要得到用户的确认。

所以我使用了window.onbeforeunloadfor 确认警报和window.onunloadfor logout()

  1. 但是这两个功能都可以在 IE 和 Chrome 中运行。(应用程序工作正常)

  2. window.onbeforeunload 在 Opera 中不起作用,我的消息不会在 Firefox 中显示。

  3. window.onunload无法在 Safari、Opera 和 Firefox 中运行。

我的 JavaScript 代码将是:

// 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();
};

我也用 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>
4

6 回答 6

100

不幸的是,这些浏览器不支持您使用的方法。为了支持我的回答(这种不支持的行为),我在下面给出了链接。

onbeforeunloadonunload不是在opera……支持这一点

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

尽管该onunload事件不能完全发挥作用,但onunload如果用户单击链接以离开带有未保存表单的页面,您可以使用它来显示警告。

onunload不工作safari...支持这一点

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

您可以尝试pagehide在 safari 浏览器中使用该事件来代替onunload.

onunload不工作firefox...支持这一点

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

他们还没有在 FF 中提出解决方案

祝你好运加油。

于 2013-02-01T13:48:58.553 回答
43

这是 ie,firefox 和 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;
            });
于 2014-01-30T11:58:49.920 回答
17

我能够使用 jQuery 让它在 IE 和 FF 中工作:

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

});

而不是:卸载、onunload 或 onbeforeunload

于 2013-03-26T21:31:47.747 回答
14

onunload通过将 Ajax 异步请求更改为同步请求,我得到了除 Opera 之外的所有浏览器的解决方案。

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

它适用于除Opera之外的所有浏览器。

于 2013-02-07T08:39:02.833 回答
6

并非所有浏览器都调用 onunload 事件。更糟糕的是,您无法检查 onbeforeunload 事件的返回值。这会阻止我们实际执行注销功能。

但是,您可以解决这个问题。

在 onbeforeunload 事件中首先调用注销。然后提示用户。如果用户取消注销,则使用 onfocus 事件自动重新登录。有点倒退,但我认为它应该工作。

'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;
};
于 2013-02-07T06:30:32.300 回答
2

Firefox 根本不显示自定义 onbeforeunload 消息。Mozilla 表示,他们正在保护最终用户免受可能显示误导性文本的恶意网站的侵害。

于 2014-11-24T10:26:40.230 回答