window.onbeforeunload和window.onunload在Firefox,Safari,Opera中不起作用?

Hum*_*ing 73 javascript jquery javascript-events

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

所以我使用了window.onbeforeunload确认警报和window.onunloadlogout().

  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();
};
Run Code Online (Sandbox Code Playgroud)

我也尝试了与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>
Run Code Online (Sandbox Code Playgroud)

Fre*_*ser 87

遗憾的是,您使用的方法在这些浏览器中不受支持.为了支持我的答案(这种不支持的行为),我在下面给出了链接.

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中提出解决方案

祝你好运欢呼.

  • 我给你**+ 50**赏金.因为你做了很多工作来得到这个建议的答案.并且它有助于其他问题. (38认同)
  • 任何更新 ?仍然不支持?,任何解决方法? (3认同)

小智 42

这是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;
            });
Run Code Online (Sandbox Code Playgroud)

  • @ user3253009,太棒了!但似乎它不适用于iPhone上的safari.任何可能的解决方法吗? (2认同)

nat*_*eld 17

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

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

});
Run Code Online (Sandbox Code Playgroud)

而不是:unload,onunload或onbeforeunload


Hum*_*ing 13

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

xmlhttp.open("POST","LogoutAction",false);
Run Code Online (Sandbox Code Playgroud)

它适用于除Opera以外的所有浏览器.


lee*_*way 5

并未在所有浏览器中调用onunload事件.更糟糕的是,您无法检查onbeforeunload事件的返回值.这使我们无法实际执行注销功能.

但是,你可以解决这个问题.

在onbeforeunload事件中首先调用logout.然后提示用户.如果用户取消其注销,则使用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;
};
Run Code Online (Sandbox Code Playgroud)

  • 看起来像是一件非常不安全的事情.为了能够自动将用户重新登录到凭证中,必须将其存储在浏览器中,这基本上允许任何人登录注销用户. (3认同)