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

时间:2011-09-23 11:01:26

标签: javascript opera onbeforeunload onunload browser-feature-detection

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

onbeforeunload = function (){ ... }

稍后在执行功能检测的同一脚本中?如果你做alert(window.onbeforeunload),你看到了什么?您可以与问题共享指向该页面的链接吗?

答案 1 :(得分:1)

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

我认为使用卸载并不好,因为它在游戏中发生得太晚了。有时onbeforeunload是唯一能做到这一点的东西。再一次,我只是在窗口对象上寻找opera,如果它存在,则拒绝它不能做的事情。 :)

PPK在此处讨论:http://www.quirksmode.org/js/detect.html

答案 2 :(得分: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.');
  });
}

答案 3 :(得分:0)

查看我的answer to a similar / duplicated question。基本上,它会在您网域的第一页上设置检测,并将检测结果存储在localStorage中的所有后续页面中。包括工作示例代码。