Javascript 如何检测用户何时离开站点?

Javascript 如何检测用户何时离开站点?,javascript,php,disconnect,Javascript,Php,Disconnect,我在读这个问题: 但是它不够全面,或者至少我不确定它是否全面,我需要检测用户何时离开网站,这可能是: 互联网消亡 电脑关闭(例如断电) 用户关闭浏览器 用户关闭运行网站的浏览器选项卡 我肯定还有更多的病例 这可能需要由服务器管理,而不是在极端情况下不会触发的某些javascript事件 您知道在这种情况下可以使用什么吗?您可以使用socket.io并在套接字丢失时监听,或者您可以让您的站点向服务器发送心跳信号,如果X毫秒过去了没有脉搏,您可以假设用户因您列出的任何原因而离开 window.

我在读这个问题:

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

  • 互联网消亡
  • 电脑关闭(例如断电)
  • 用户关闭浏览器
  • 用户关闭运行网站的浏览器选项卡
我肯定还有更多的病例

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


您知道在这种情况下可以使用什么吗?

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

 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?";
  }

对于最后两种情况,即检测浏览器关闭或选项卡关闭事件,您可以使用window.onbeforeunload。对于电源故障或连接问题的前两个事件,只能执行连续ping或心跳机制。

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


如果用户未进行任何活动,并且时间不会更新,如果以db为单位的时间小于time()-$interval,则可以假设用户已离开,失去了连接等。

我正在使用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>

window.onbeforeunload=函数(){//如果用户离开了页面
用户_左_页();
};
函数user_left_page(){//user left页面将数据发送到php以存储到我的数据库中
var action=“左_页”;
$.ajax({
url:“includes/track page time.inc.php”,
方法:“张贴”,
数据:{action:action},
成功:功能(数据){
},
});
}
//下面这一条是用来存储用户在页面中花费的时间。我两者都用
//在我的代码中,基本上我每3秒存储一次数据以了解时间
setInterval(函数(){
更新用户活动();
}, 3000);//将信息发送到数据库的间隔时间
函数update\u user\u activity(){//用户是否在页面中?
var action=“更新时间”;
$.ajax({
url:“includes/track page time.inc.php”,
方法:“张贴”,
数据:{action:action},
成功:功能(数据){
},
});
}

您不能使用php会话吗?这不是OP想要的。我想他的请求是为了跟踪。这只涵盖OP描述的最后两种情况。在突然连接或电源故障时,
onbeforeunload
事件自然不会触发。嗨,@AlienWebguy,你的答案看起来很有希望。我想知道socket.io和心跳的事情。如果可能的话,你能分享一些链接吗?提前感谢。当然,默认情况下,socket.io每25秒发送一次心跳,客户端有60秒的时间来响应每个脉冲。您可以配置它(),也可以在不使用套接字的情况下复制相同的逻辑,让客户端每分钟左右使用令牌将机器时间发送给服务器上的脚本,并且每隔几分钟服务器可以根据发布的机器时间检查服务器时间-如果他们没有保持接近,你假设用户已经离开了。是的,但最后一种情况更常见。如果电脑关闭或崩溃,我想用户不想再呆下去了?但显然有一个首选语法是的,第二个会更好,正如你所说的。我使用第二个来存储用户在我的页面上花费的时间。如果计算机崩溃或爆炸或其他情况,时间将停止添加。但状态仍将保持不变。