检测不支持onunload/onbeforeunload的浏览器

5
在所有浏览器中,似乎只有Opera不支持onunload/onbeforeunload事件。(15年过去了,Opera!)这个问题的解决方案已经被多次提及,例如在这里:onbeforeunload support detection 不幸的是,截至到Opera 11.51版本,("onbeforeunload" in window) == true,但实际上onbeforeunload事件从未执行!
我的Web应用程序需要在用户离开页面时向服务器发送数据;我正在使用同步ajax请求来实现。看起来我必须使用一个“保存”按钮来解决Opera的问题。然而,我不希望这个按钮会让那些浏览器通过ajax自动保存的用户感到困惑,所以我真的希望这个按钮只在Opera中出现。
我的唯一选择是浏览器检测吗?问题是,Opera有一个选项可以伪装成其他浏览器。

为什么不在Opera中使用onuload - c69
body.onunload 在 Opera 11.5 中有效,除非您调用了 window.location.reload() - Lyth
<body onunload = 'alert("test")'>body.onunload = function() {alert("test")};body.unload(function() {alert("test")}); 在我的机器上都无法工作。我使用的是Opera 11.51,没有添加任何插件,操作系统为Windows 7 64位。 - Unknown artist
1
你是在刷新/重新加载页面还是导航到另一个页面? <body onunload="alert('!')"><p onclick="window.location.reload();">点击这里重新加载</p><p><a href="http://ya.ru">Get away</a></p></body> - 在这种情况下,我已经让onunload起作用了,当你离开页面时会弹出警告。无论如何,如果你关闭页面/应用程序,Opera不会执行代码,所以更好的方法可能是实现一些其他类型的数据保存。如何使用本地存储? - Lyth
是的,你说得对,我的问题是我需要在所有情况下保存数据,而我主要是通过关闭选项卡来测试它。本地存储是一个好主意,但据我所知,在Opera中进行的更改如果用户从另一个浏览器登录,则不会显示出来。此外,我们都是俄罗斯人吗?还是时区的问题,美国人正在睡觉? :D - Unknown artist
你能给我们提供一个链接,在Opera中('onbeforeunload' in window)返回true吗?在这里它返回了一个正确和预期的“false”。 - hallvors
4个回答

3
我无法重现您发现的在Opera 11.5x中'onbeforeunload' in windowtrue的情况。这是最佳方法,应该仍然有效。您确定没有留下一些定义,例如您已经写了


onbeforeunload = function (){ ... }

在执行功能检测的同一脚本中后面的位置?如果您执行alert(window.onbeforeunload),您会看到什么?您能分享一下出现问题的页面链接吗?


2
我可以确认,在Opera 11.62中检查过后,alert('onbeforeunload' in window)确实显示为false。我甚至使用了opera:config > User Agent > Spoof UserAgent ID设置了各种值进行检查,但对我来说始终是false - jakub.g
在Opera 15中,我得到了true(这是正确的,因为它现在在基于Webkit的引擎中得到支持)。我还可以验证在12.15中它是false。 - wojo

1

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

我认为使用unload不好,因为它发生得太晚了。有时候只有onbeforeunload才能解决问题。再次提醒,我只是在window对象上查找opera,如果存在,就拒绝它不能做的事情。 :)

PPK在这里谈到了这个问题:http://www.quirksmode.org/js/detect.html


2
寻找window.opera并不是一个好的方法。要寻找功能,而不是浏览器 :) - hallvors

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.');
  });
}

0

请查看我回答类似或重复的问题。基本上,它在您的域上的第一个页面上设置检测,并将该检测结果存储为后续所有页面中的localStorage。包括可工作的示例代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接