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

IT技术 javascript jquery dom-events
2021-01-11 16:02:43

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

所以我使用了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>
6个回答

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

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

祝你好运加油。

您共享的支持onunload在 Firefox不起作用的声明的链接仅在页面处于弹出状态时表示。“当页面在弹出窗口中时,window.onUnload 不起作用”
2021-03-18 16:02:43
如果我首先与页面交互(例如单击页面),这对我来说可靠。如果我在交互之前简单地按下 command-r,对话框不会可靠地出现在我在 OSX 上测试的浏览器(FF、Safari、Chrome 和 Opera)中。
2021-03-24 16:02:43
我给了+50 的赏金。因为你做了很多工作来得到这个建议的答案。它对其他问题有帮助。
2021-04-02 16:02:43
任何更新 ?仍然不支持?,任何解决方法?
2021-04-10 16:02: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;
            });
哪个回应@KumarHarsh?
2021-03-20 16:02:43
@user3253009.你如何在这里找到回复?
2021-03-24 16:02:43
@user3253009,太棒了!但似乎它不适用于 iPhone 上的 safari。任何可能的解决方法?
2021-03-24 16:02:43
@user3253009,当弹出窗口显示“留在页面”或“离开页面”时,我们可以捕捉到用户是否点击了哪个按钮的响应。
2021-04-01 16:02:43
不@KumarHarsh 你无法捕捉到响应,这是浏览器行为,你可以留下或离开页面。
2021-04-06 16:02:43

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

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

});

代替:卸载、卸载或卸载

@nathanhayfield 这工作正常,但有一个弹出窗口。我怎么能忽略呢?
2021-03-12 16:02:43
@JavaPlayer 它似乎在 Firefox 26.x 中对我有用......你有没有寻找其他 javascript 错误。它继续为我工作。
2021-03-16 16:02:43
@nathanhayfield 我也试过,有确认提示。为什么显示?我的函数/代码中没有警报
2021-03-25 16:02:43

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

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

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

它适用于 Firefox,但不幸的是mdn 说它应该被弃用
2021-04-10 16:02:43

并非在所有浏览器中都调用 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;
};
似乎是一件非常不安全的事情。为了能够自动让用户重新登录凭据必须存储在浏览器中,这基本上允许任何人登录已注销的用户。
2021-03-14 16:02:43