Chrome 中的 window.onbeforeunload:最近的修复是什么?

IT技术 javascript onbeforeunload window.onunload
2021-02-15 17:00:02

显然,正如我从我遇到的所有问题中看到的那样,window.onbeforeunload 在 Chrome 中遇到了相当多的问题。最近的工作是什么?

我得甚至接近工作的唯一事情是这样

window.onbeforeunload = function () { return "alert" };

但是,如果我将 return "alert" 替换为 alert("blah") 之类的内容,则 Chrome 将一无所获。

我在这个问题中看到谷歌故意阻止了这一点。对他们有好处...但是如果我想在有人关闭窗口时进行 AJAX 调用怎么办?就我而言,我想知道某人何时离开了我网站上的聊天室,并通过窗口关闭发出信号。

我想知道是否有办法
(a): 修复 window.onbeforeunload 调用,以便我可以将 AJAX 放在那里

(b): 获得一些其他方法来确定窗口已在 Chrome 中关闭

5个回答

回答:

$(window).on('beforeunload', function() {
    var x =logout();
    return x;
});
function logout(){
        jQuery.ajax({
        });
        return 1+3;
}

有点混搭,但对我有用。1+3 确保正在调用注销功能(如果它在您尝试离开时成功在弹出窗口中成功,您将看到 4)。

这在 chrome 中不起作用,它还会弹出警报。有没有办法忽略 chrome 中的警报?
2021-04-21 17:00:02
@Lior 这只是一个例子.. 根本没有关系。
2021-04-30 17:00:02
嗨,此代码对我不起作用。我需要添加一些 jQuery js 文件或其他东西吗?
2021-05-04 17:00:02
这不起作用,它不输出自定义消息。
2021-05-09 17:00:02
@varatis "4 --- 你确定要离开这个页面吗?" 是我得到的确认对话框。但我发现的解决方法是return null.
2021-05-15 17:00:02

截止到 69.0.3497.92,Chrome 还没有达到标准。但是,已提交错误报告,并且正在进行审查

  • Chrome 要求通过引用事件对象而不是处理程序返回的值来设置 returnValue。
  • 标准规定该提示可以通过取消该事件或返回值设置为控制非空值
  • 标准规定作者应该使用 Event.preventDefault() 而不是 returnValue。
  • 标准规定向用户显示的消息是不可定制的。

window.addEventListener('beforeunload', function (e) {
    // Cancel the event as stated by the standard.
    e.preventDefault();
    // Chrome requires returnValue to be set.
    e.returnValue = '';
});
    
window.location = 'about:blank';

这里有更新吗?
2021-05-05 17:00:02

这是一个更直接的方法。

$(window).on('beforeunload', function() {
    return "You should keep this page open.";
});

返回的消息可以是您想要的任何内容,如果您没有要添加到 Chrome 已显示的消息中的内容,则包括空字符串。结果如下所示:

在此处输入图片说明

@c4k 我认为最新的 chrome 更新中的某些内容破坏了这一点。就我而言,返回的自定义消息在一周前有效,但在安装了 chrome 补丁后,它不再有效。
2021-05-05 17:00:02
@Chronozoa,你是对的: chromestatus.com/feature/5349061406228480
2021-05-14 17:00:02
我尝试了同样的事情,但它不起作用。警报显示正确,但没有我的自定义消息。
2021-05-16 17:00:02

根据MDN

该函数应为 Event 对象的 returnValue 属性分配一个字符串值并返回相同的字符串。

这是以下

window.addEventListener( 'beforeunload', function(ev) { 
    return ev.returnValue = 'My reason';
})
在 Chrome 版本“64.0.3282.186(官方版本)(64 位)”或 Firefox 58.0.2(64 位)上似乎并不完全适用于我 - 要求确认但不使用自定义消息。我尝试了直接引用的页面中的示例并得到了相同的结果。
2021-04-23 17:00:02
非常感谢!这适用于 Chrome 63;不分配returnValue返回字符串是不够的。
2021-04-26 17:00:02
这是一种正确的想法,但您忘记将 'beforeunload' 事件添加到侦听器中。
2021-05-11 17:00:02

这解决了我的问题,为什么它在我的应用程序中不起作用:

请注意,在关闭窗口之前,用户必须以某种方式与页面交互(单击某处),否则 beforeunload 将被忽略,以免防止滥用。

嗨,你可能忘记粘贴你的答案了吗?
2021-05-11 17:00:02