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


76

在我的聊天应用程序中,我需要在关闭应用程序时从user获得确认。

所以我使用了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();
};

我也尝试过使用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>

可在我的Firefox上运行,但该消息不是您发送的。jsfiddle.net/yhx6d
法布里西奥磨砂

感谢您的回复...是的消息将不会显示。而且logout()无法正常工作。这意味着window.onunload()无法正常工作吗?
人类

window.onbeforeunloadwindow.onunload在歌剧中不起作用?
人类

1
Opera不支持, onbeforeunload并且支持onunload不完整。
Marcel Korpel 2013年

1
请检查stackoverflow.com/questions/5548505/… 中的Firefox问题
mymotherland

Answers:


92

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

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的解决方案

祝你好运。


40
我给了您50英镑的赏金,因为您花了很多功夫才能得到建议的答案,对于其他问题也有帮助。
人类

3
任何更新 ?仍不支持吗?有什么解决方法?
Francisco Corrales Morales 2014年

您共享以支持onunload在firefox中不起作用的语句的链接是指仅在页面处于弹出状态时使用的链接。“ window.onUnload在页面弹出时不起作用”
Nick Rolando

43

这是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 2014年

@KumarHarsh哪个回复?
faisale 2014年

@ user3253009,当弹出窗口显示为“停留在页面”或“离开页面”时,无论用户单击哪个按钮,我们都可以捕获响应。
KumarHarsh 2014年

否@KumarHarsh,您无法捕获响应,这是浏览器的行为,您可以停留或离开该页面。
faisale 2014年

2
@ user3253009,太好了!但似乎在iPhone上的野生动物园中不起作用。任何可能的解决方法吗?
user2335065

17

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

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

});

而不是:卸载,onunload或onbeforeunload


@JavaPlayer在firefox 26.x中似乎对我有用...您是否在寻找其他javascript错误。它继续为我工作。
森·海菲尔德

@nathanhayfield,它工作正常,但有一个弹出窗口。我怎么能忽略呢?
WP学习者

@nathanhayfield我也尝试过,并且有确认警报。为什么显示?我的功能/代码中没有警报
WP Learner

14

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

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

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


它工作在Firefox,但不幸的是MDN说其所谓过时
oldboy

6

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

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

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

'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
似乎很不安全。为了能够自动将用户重新登录,凭据必须存储在浏览器中,该浏览器基本上允许任何人都可以注销登录的用户。
尼古拉斯

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.