如何检测用户何时离开网站?

Posted

技术标签:

【中文标题】如何检测用户何时离开网站?【英文标题】:How to detect when a user leaves the site? 【发布时间】:2015-01-10 04:31:42 【问题描述】:

我正在阅读这个问题:Trying to detect browser close event

但不够全面,或者至少我不确定,我需要检测用户何时离开网站,这可能是:

互联网死了 PC 关机(例如断电) 用户关闭浏览器 用户关闭网站运行所在的浏览器标签

我相信还有更多的案例。

这可能需要由服务器管理,而不是某些极端情况下不会触发的 javascript 事件。

有什么想法可以在这种情况下使用吗?

【问题讨论】:

你能不使用php会话吗? 【参考方案1】:

您可以使用 socket.io 并监听套接字何时丢失,或者您可以让您的站点向服务器发送心跳,如果 X 毫秒没有脉冲,您可以假设用户离开了任何您列出的原因。

【讨论】:

嗨,@AlienWebguy,你的回答看起来很有希望。我想知道 socket.io 和 heartbeat 的事情。如果可能的话,你能分享一些链接吗?提前致谢。 当然,socket.io默认发送心跳,每25秒一次,客户端有60秒的时间响应每个脉冲。您可以对其进行配置(github.com/Automattic/socket.io/wiki/Configuring-Socket.IO),或者您可以在没有套接字的情况下重现相同的逻辑,只需让客户端每分钟左右将机器时间发送到服务器上带有令牌的脚本,并且每隔几分钟您的服务器可以检查服务器时间与发布的机器时间 - 如果他们没有保持关闭,您假设用户已经离开。【参考方案2】:

我正在使用 Java 脚本来检测离开事件并向我的服务器发送 ajax 请求,以便我可以存储用户离开页面的情况。 第二部分是检测用户在我页面的时间,每3秒我也会向我的数据库发送一个ajax请求来保存用户在页面中的时间。

<script>



window.onbeforeunload = function()//If user left the page
    user_left_page();
;
function user_left_page()//USER LEFT THE PAGE send data to php to store into my database
    var action = "left_page";
    $.ajax(
        url:"includes/track-page-time.inc.php",
        method:"POST",
        data: action: action,
        success: function(data)
        ,
    );

//This one below is to store the time the user is spending in your page. I am using both
// in my code, basically I keep storing the data every 3 seconds to know the time
setInterval(function () 
    update_user_activity();
, 3000);//Interval time to send the info to the database

function update_user_activity()//IS USER IN THE PAGE?
    var action = "update_time";
    $.ajax(
        url:"includes/track-page-time.inc.php",
        method:"POST",
        data: action: action,
        success: function(data)
        ,
    );




</script>

【讨论】:

是的,但到目前为止,最后一种情况更为常见。如果电脑关闭或崩溃,我想用户不想再留下来了? 但显然有一个首选语法developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/… 是的,如你所说,第二个会更好。我使用第二个来存储用户在我的页面上花费的时间。如果电脑死机或爆炸什么的,时间将停止添加。但状态仍为 ON。【参考方案3】:

另一种简单的方法,您可以跟踪 IP/会话 ID 并保存在数据库中,您可以使用 ajax 调用每隔 5 或 10 分钟更新一次数据库中的时间。

如果用户没有进行任何活动并且时间不会更新,如果 db 中的时间小于 time() - $intervals ,那么您可以假设用户已经离开,迷路了连接性等。

【讨论】:

【参考方案4】:

您可以在最后两种情况下使用 window.onbeforeunload,即检测浏览器关闭或标签关闭事件。对于前两个事件是掉电或者连接问题,只有不断ping或者like AlienWebguy said的心跳机制才能实现。

【讨论】:

【参考方案5】:
 window.onbeforeunload = confirmExit;
  function confirmExit()
  
    return "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
  

Ref site

【讨论】:

这不是 OP 想要的。我想他的请求是出于跟踪目的。 这将仅涵盖 OP 描述的最后 2 个场景。 onbeforeunload 事件自然不会在突然连接或电源故障时触发。

以上是关于如何检测用户何时离开网站?的主要内容,如果未能解决你的问题,请参考以下文章

检测用户是不是离开网站[重复]

检测用户何时离开网页的最佳方法?

如何检测用户是不是因网络断开而离开凤凰频道?

如何检测自定义表格视图单元格何时离开屏幕?

Android:如何检测滚动何时结束

如何检测flutter网站是不是在浏览器后台运行?