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

83
在我的聊天应用程序中,我需要在我的应用程序关闭时从用户那里获得确认。因此,我使用了window.onbeforeunload来进行确认提示,使用了window.onunload来执行logout()操作。 但是在Opera中,这两个函数都不起作用,并且在Firefox中也无法显示我的消息。在IE和Chrome中应用程序工作正常。 我的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>

谢谢您的回复...是的,消息不会显示。另外,**logout()也无法正常工作。这是否意味着window.onunload()**也无法正常工作? - Human Being
window.onbeforeunload和window.onunload在Opera中无法正常工作? - Human Being
1
OperaõĖŹµö»µīüonbeforeunload’╝īĶĆīÕ«āÕ»╣onunloadńÜäµö»µīüõ╣¤õĖŹÕ«īµĢ┤ŃĆé - Marcel Korpel
@Marcel Korpel,感谢您的回复...不完整的onunload是什么意思?无法理解。 - Human Being
1
请检查 https://dev59.com/31XTa4cB1Zd3GeqP5-WP 以解决Firefox问题。 - mymotherland
显示剩余5条评论
6个回答

105

很遗憾,您正在使用的方法在那些浏览器中不受支持。为了支持我的回答(这种不友好的行为),我已经在下面提供了链接。

onbeforeunloadonunloadopera中无法正常工作...支持此功能

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

虽然onunload事件并不能完全正常工作,但您可以使用onunload来在未保存表单的情况下,弹出警告提示用户是否离开该页面。

onunload在中无法正常工作...支持此功能

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

你可以尝试在safari浏览器下使用pagehide事件代替onunload

onunloadfirefox中无法正常工作...支持此功能

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

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


44
我给了你**+50**的悬赏,因为你为得到这个建议的答案付出了很多努力。它对其他问题也有帮助。 - Human Being
3
有更新吗?还是不支持?有什么解决办法吗? - Francisco Corrales Morales
你分享的链接支持了这样一种说法,即 onunload 在 Firefox 中不起作用,但只针对页面仅在弹出窗口的情况下才是如此。"当页面在弹出窗口中时,window.onUnload 无法工作"。 - Nick Rolando
只要我先与页面进行交互(例如,点击页面),这对我来说是可靠的。如果在交互之前仅按command-r,则对于我在OSX上测试的浏览器(FF,Safari,Chrome和Opera),该对话框不会可靠地出现。 - Paul

45

以下是适用于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;
            });

@user3253009. 你觉得这里的回应怎么样? - KumarHarsh
不,@KumarHarsh你无法捕获响应,这是浏览器的行为,你只能选择留在页面或离开页面。 - faisale
2
@user3253009,太好了!但似乎在iPhone的Safari上不起作用。有什么可能的解决方法吗? - user2335065
它对我有效。你能解释一下在你的代码之后我如何分离这个事件吗? - jekaby
谢谢,对我很有效!我在Chrome 50、Firefox 46和IE11中进行了测试。它会在页面重新加载、返回按钮、链接和关闭浏览器窗口/选项卡时显示提示。我很惊讶jQuery unload方法不能如此完美地工作。 - Gerry
显示剩余5条评论

17

我能够使用jQuery的以下代码在IE和FF中让它正常工作:

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

});

替代: unload、onunload 或 onbeforeunload


@JavaPlayer 在我的 Firefox 26.x 上似乎可以工作... 你有没有寻找其他 JavaScript 错误。它对我仍然有效。 - nathan hayfield
@nathanhayfield 这个功能运行良好,但有一个弹出窗口。我该如何忽略它? - WP Learner
@nathanhayfield 我也尝试了,但是出现了一个确认警告。为什么会有这个?我的函数/代码中并没有警告。 - WP Learner
我无法在Safari中使其正常工作。如何让它在Safari中正常工作? - MeSo2

14

我已经找到了解决方案,可以在除 Opera 以外的所有浏览器中使用 onunload,方法是将 Ajax 异步请求更改为同步请求。

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

除了Opera浏览器外,它适用于所有浏览器。


它在Firefox中可以工作,但不幸的是mdn说它被认为已经过时。 - oldboy

7

在所有浏览器中都无法调用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;
};

3
似乎是一件非常不安全的事情。为了能够自动登录用户,凭据必须存储在浏览器中,这基本上允许任何人将已注销的用户登录。 - Niclas

2
火狐浏览器不会显示自定义的onbeforeunload消息。Mozilla表示他们在保护最终用户免受可能会显示误导文本的恶意网站的攻击。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接