5

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

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

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

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

+0

为什么不在歌剧中使用'onuload'? – c69

+0

'在Opera 11.5,body.onunload'工作,除非你调用'window.location.reload()'' – Lyth

+0

<身体onunload的= '警报( “测试”)'>','body.onunload =功能() {警报( “测试”)};'和'body.unload(函数(){警报( “测试”)});'都不要我的机器上工作。歌剧11.51,没有附加组件,Windows 7 64位。 –

回答

1

歌剧把这只狗弄坏了。我通过寻找window.opera来检测Opera,如果它存在,我否认Opera无法处理。

我认为使用卸载并不好,因为它在游戏中发生得太晚。有时onbeforeunload是唯一可以做到的。我再一次在窗口对象上寻找歌剧,如果它存在,就否认它不能做的事情。 :)约在这里

PPK会谈:http://www.quirksmode.org/js/detect.html

+2

寻找window.opera不是一个好办法。寻找功能,而不是浏览器:) – hallvors

3

我无法重现你的发现,'onbeforeunload' in window是在Opera 11.5倍true。这是做到这一点的最好方式,应该仍然有效。你确定你没有在某个地方留下一些定义,例如你已经写了

onbeforeunload = function(){ ... } 

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

+2

我可以确认,我刚刚检查了Opera 11.62和'alert('onbeforeunload'在窗口中)'确实说'false'。我甚至用'opera:config> User Agent> Spoof UserAgent ID'设置了不同的值,但对我来说这一直是错误的。 –

+0

在Opera 15中,我获得了真实(这是正确的,现在它在基于Webkit的引擎中受到支持)。我也可以在12.15验证它是错误的。 – wojo

0

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

你会发现我使用可用的isEventSupported()函数在https://github.com/kangax/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

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