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

时间:2013-02-01 11:10:10

标签: javascript javascript-events jquery

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

因此,我使用window.onbeforeunload进行确认提醒,并使用window.onunload 注销()。

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

  2. window.onbeforeunload无法在Opera中使用,我的消息也不会在Firefox中显示。

  3. window.onunload无法在Safari,Opera和Firefox中使用。

  4. 我的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>
    

6 个答案:

答案 0 :(得分:83)

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

onbeforeunloadonunload无效opera ...支持此

  

onbeforeunload in Opera
  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/

您可以尝试使用Safari浏览器中的pagehide事件代替onunload

onunload无法在firefox中工作...以支持此

  

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

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

祝你好运欢呼。

答案 1 :(得分: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;
            });

答案 2 :(得分:16)

我能够使用jQuery的IE和FF工作:

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

});

而不是:unload,onunload或onbeforeunload

答案 3 :(得分:13)

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

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

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

答案 4 :(得分: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;
};

答案 5 :(得分:2)

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