代码之家  ›  专栏  ›  技术社区  ›  Wilhelm Murdoch

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

  •  2
  • Wilhelm Murdoch  · 技术社区  · 15 年前

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

    最初,当用户离开页面时,数据被发送到脚本。在“leaves”中,我指的是刷新、来回浏览历史记录、关闭窗口/选项卡并转到其他地址。

    该解决方案适用于除Opera以外的所有浏览器。我正在使用jquery的“卸载”事件,这根本不受Opera支持。在卸载或卸载之前都不打开。

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

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

    有什么建议吗?还是我只坚持以上的选择?

    谢谢!

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

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

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

    在线89工作得很好。我唯一关心的是开销,所以我仍然在寻找一个更优雅的解决方案。

    3 回复  |  直到 13 年前
        1
  •  2
  •   davethegr8 Community Driven Business    15 年前

    根据 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中都不一致,可能根本不起作用。

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

        2
  •  1
  •   jimyi    15 年前

    添加这一行javascript对您有用吗?

    history.navigationMode = 'compatible';
    

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

        3
  •  1
  •   gorivo    13 年前

    我也遇到了同样的问题,这就省去了我的一天:

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

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