Opera:检测后退,前进,刷新和关闭事件

时间:2009-08-27 04:38:33

标签: javascript jquery browser opera onunload

我目前正在开发一个跟踪访问者鼠标行为的jQuery插件。移动,点击,滚动和调整大小都会通过Ajax记录并发送到解析和存储此数据的位置。

最初,当用户离开页面时,数据被发送到脚本。通过'叶子'我指的是刷新,历史来回,关闭窗口/标签并转到不同的地址。

该解决方案适用于Opera以外的所有浏览器。我正在使用jQuery的'unload'事件,而Opera根本不支持它。无论是onbeforeunload还是onunload。

问题是,如何为Opera浏览器实现这种功能?

我的一个解决方案是特别使用我创建的“轮询”功能。此功能允许您指定每隔“x”秒将内容推送到服务器的间隔。将此设置为1秒专门用于Opera浏览器可能会解决此问题,但这是一个非常大的开销,并且请求并不总是按顺序完成等等...

有任何建议或者我只是坚持使用上述选项吗?

谢谢!

我想我可以将你们链接到插件源码。 http://www.thedrunkenepic.com/junk/jquery.mousalytics.js

关于上面链接的代码,添加:

if(window.opera)
{
options.interval = 1;
}

第89行很棒。我唯一担心的是开销,所以我仍然在寻找更优雅的解决方案。

3 个答案:

答案 0 :(得分:2)

根据http://bytes.com/topic/javascript/insights/799229-browser-quirk-onload-onunload-do-not-fire-back-forward-refresh-opera,Opera从未真正触发onload / onunload事件,因此如果没有黑客攻击,这样的功能是不可能的。

http://dev.opera.com/articles/view/efficient-javascript/?page=4似乎证实了这一点,并且基本上表明opera会尝试跨请求维护页面状态。

在进一步投资时,http://unitehowto.com/Onunload表示可能可能opera.io.webserver.addEventListener('_close', onunload, false);(其中onunload是以前定义的函数),但它也表明此功能不是在所有版本的歌剧中都是一致的,可能根本不起作用。

我认为您最好的选择可能是使用Opera的轮询选项,或者可能使用服务器端检查当前页面以及它在历史队列中的位置。

答案 1 :(得分:1)

添加这行JavaScript是否适用于您?

history.navigationMode = 'compatible';

来源:http://www.opera.com/support/kb/view/827/

答案 2 :(得分:1)

我遇到了同样的问题,这节省了我的一天:

if( typeof(opera) != 'undefined' )
{
    opera.setOverrideHistoryNavigationMode( 'compatible' );
    history.navigationMode = 'compatible';
}

有关此问题的详细信息,请访问:http://www.opera.com/support/kb/view/827/