【问题标题】:window.onbeforeunload and window.onunload is not working in Firefox, Safari, Opera?window.onbeforeunload 和 window.onunload 在 Firefox、Safari、Opera 中不起作用?
【发布时间】:2013-01-16 16:32:44
【问题描述】:

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

所以我使用window.onbeforeunload 确认警报和window.onunload 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>

【问题讨论】:

  • 可以在我的 Firefox 上运行,但该消息不是您发送的消息。 jsfiddle.net/yhx6d
  • 感谢您的回复...是的消息不会显示。另外 logout() 不起作用。这意味着 window.onunload()不工作?
  • window.onbeforeunloadwindow.onunload 在歌剧中不起作用?
  • Opera doesn't support onbeforeunload 及其对onunload 的支持不完整。
  • 请检查 stackoverflow.com/questions/5548505/… 的 firefox 问题

标签: javascript jquery dom-events


【解决方案1】:

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

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

祝你好运欢呼。

【讨论】:

  • 我给了你 +50 赏金。因为你付出了很多努力才得到这个建议的答案。它对其他问题很有帮助。
  • 有什么更新吗?仍然不支持?,有什么解决方法吗?
  • 您共享的链接以支持 onunload 在 Firefox 中不起作用的声明,仅在页面处于弹出状态时表示。 “当页面在弹出窗口中时,window.onUnload 不起作用”
  • 如果我首先与页面交互(例如,单击页面),这对我来说确实有效。如果我只是在交互之前按 command-r,则对话框不会可靠地出现在我在 OSX 上测试的浏览器(FF、Safari、Chrome 和 Opera)中。
【解决方案2】:

这里是 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?
  • @user3253009,当弹出“留在页面”或“离开页面”时,我们可以捕捉到用户是否点击了哪个按钮的响应。
  • no @KumarHarsh 你无法捕捉到响应,这是浏览器的行为,你可以留下也可以离开页面。
  • @user3253009,太好了!但似乎它不适用于 iPhone 上的 safari。有任何可能的解决方法吗?
【解决方案3】:

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

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

});

代替:卸载、onunload 或 onbeforeunload

【讨论】:

  • @JavaPlayer 它在 Firefox 26.x 中似乎对我有用...您是否查找过其他 javascript 错误。它继续为我工作。
  • @nathanhayfield 这工作正常,但有一个弹出窗口。我怎么能忽略它?
  • @nathanhayfield 我也试过了,有一个确认警报。为什么会显示?我的函数/代码中没有警报
【解决方案4】:

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

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

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

【讨论】:

  • 它在 Firefox 中工作,但不幸的是 mdn says 它应该被弃用了
【解决方案5】:

并非所有浏览器都会调用 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;
};

【讨论】:

  • 似乎是一件非常不安全的事情。为了能够自动让用户重新登录凭据,必须将凭据存储在浏览器中,这基本上允许任何人登录已注销的用户。
【解决方案6】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多