【问题标题】:JS: How to detect when a user leaves your site excluding reloadJS:如何检测用户何时离开您的网站,不包括重新加载
【发布时间】:2016-02-19 13:47:54
【问题描述】:

所以基本上,每当用户通过关闭浏览器、关闭选项卡或只是切换到新网站离开我的网站时,我想触发一个 ajax 调用。但是,我想排除重新加载。我在 stackoverflow 上看到过这样的解决方案:

window.onbeforeunload = function(){
  // call some ajax call
};

但是,此解决方案也会在重新加载时触发,这是我不想要的。

【问题讨论】:

  • w3schools.com/jsref/event_onunload.asp 表示“用户重新加载页面时也会触发onunload事件”
  • 使用会话或 Cookie。
  • 问题已被多次询问。答案是,你看不出来,再加上现代浏览器在页面退出时会杀死打开的 httprequests,所以当浏览器退出时这是一个竞争条件。并且有一些方法可以退出 onbeforeunload/unload 不会触发的浏览器

标签: javascript events javascript-events event-handling


【解决方案1】:

简短的回答:你不能,但你可以实现一些接近的目标。

让您的服务器“暂停”AJAX 调用几秒钟,然后在您的主体顶部添加一个 JS sn-p,以发出另一个 AJAX 请求,说“我访问了这个页面”

如果相同的 cookie/会话在离开后几秒钟内调用“我访问过此页面”,那么您知道用户可能重新加载。

这不是万无一失的,但它可能适合您的需求。

【讨论】:

    【解决方案2】:

    您根本无法保证 ajax 调用会以可以关闭浏览器窗口的所有方式成功发送。您可以尝试并且有时可能会成功,但最好找到一个不依赖于那种类型的 ajax 调用的更好的设计。

    此外,给定的浏览器窗口不知道何时发生重新加载以及用户刚刚导航到新页面的时间。旧页面和新页面是完全不同的 Javascript 上下文,彼此一无所知。

    一种可能的机制主要在服务器端实现,涉及 webSockets。 您的页面每次加载时都会与服务器建立 webSocket 连接。每当页面关闭时,webSocket 连接也将关闭。

    服务器可以监控 webSocket close 以查看每次关闭页面。如果服务器在每次 webSocket 关闭时设置了一个短计时器,并且每个页面都有一个标识用户的 cookie,那么服务器可以查看 webSocket 连接是否在几秒钟内重新建立。如果它被重新建立,那么用户只是在重新加载。如果在短时间内没有重新建立,则用户已关闭或导航离开。

    使用这种机制,您的服务器可以准确监控用户何时开始查看页面以及何时关闭页面。而且,如果关闭和再次打开之间的间隔很短,那本质上就是重新加载(可以忽略)。因此,使用这种机制,您可以跟踪网页的所有客户端查看情况。

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2013-06-17
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多