5

在所有浏览器中,似乎只有 Opera 不支持 onunload/onbeforeunload 事件。(现在已经十五年了,Opera!)这个问题的解决方案已经被介绍过很多次了,例如:onbeforeunload support detection

不幸的是,从 Opera 11.51 开始,("onbeforeunload" in window) == true实际的 onbeforeunload 事件从未执行!

当用户离开页面时,我的 Web 应用程序需要向服务器发送数据;我正在为此使用同步 ajax 请求。看来我不得不求助于在页面某处使用“保存”按钮来掩盖 Opera 问题。但是,我不希望这个按钮让浏览器能够通过 ajax 自动保存的用户感到困惑,所以我真的希望这个按钮只出现在 Opera 中。

我唯一的选择是浏览器检测吗?问题是,无论如何,Opera 都可以选择将自己伪装成其他浏览器。

4

4 回答 4

3

我无法重现您 在 Opera 11.5x 中'onbeforeunload' in window的发现。true这是最好的方法,并且应该仍然有效。你确定你没有在某个地方留下一些定义吗,例如你写过

onbeforeunload = function (){ ... }

稍后在执行特征检测的同一脚本中?如果你这样做alert(window.onbeforeunload),你会看到什么?你能分享一个指向有问题的页面的链接吗?

于 2011-09-26T08:18:15.260 回答
1

Opera 在这个上搞砸了。我通过查找 window.opera 来检测 Opera,如果它存在,我会拒绝 Opera 无法处理的内容。

我认为使用 unload 不好,因为它在游戏中发生得太晚了。有时 onbeforeunload 是唯一可以解决问题的方法。再一次,我只是在窗口对象上寻找opera,如果它存在,就否认它不能做的事情。:)

PPK 在这里谈论它:http ://www.quirksmode.org/js/detect.html

于 2011-09-24T18:40:26.873 回答
0

对于任何偶然发现这篇文章的人,这是我用来检测 onbeforeunload 支持的代码片段,如果浏览器不支持它,我会切换到 onunload(注意使用 jquery,显然不是必需的)。在我的例子中,我使用这段代码(以及一些额外的代码)来检查是否有任何 AJAX 请求仍然处于活动状态并阻止用户导航。请记住,使用 onunload 并不理想,因为浏览器仍会离开页面,但至少它让您有机会警告用户数据可能已丢失,他们应该返回并检查。

您会注意到我正在使用https://github.com/kangax/iseventsupported提供的 isEventSupported() 函数来支持跨浏览器检测可用事件。

// If the browser supports 'onbeforeunload'
if (isEventSupported('beforeunload', window)) {
  $(window).on('beforeunload', function(){
    return 'This page is still sending or receiving data from our server, if you recently submitted data on this page please wait a little longer before leaving.';
  });
} 
// The browser doesn't support 'onbeforeunload' (Such as Opera), do the next best thing 'onunload'.
else {
  $(window).on('unload', function(){
    alert('This page was still sending or receiving data from our server when you navigated away from it, we would recommend navigating back to the page and ensure your data was submitted.');
  });
}
于 2012-09-16T09:39:48.083 回答
0

请参阅我对类似/重复问题的回答。基本上,它会在您域的第一页上设置检测,并将所有后续页面的检测结果存储在localStorage. 包括工作示例代码。

于 2013-08-08T22:38:43.217 回答