【问题标题】:AJAX and user leaving a pageAJAX 和用户离开页面
【发布时间】:2012-05-03 14:14:29
【问题描述】:

我正在进行聊天,并试图弄清楚如何检测用户是否离开了页面。几乎所有事情都由数据库处理,以避免前端混乱。

所以我想做的是一旦页面因任何原因离开(窗口关闭、转到另一个页面、单击链接等),将在一个人离开之前触发 ajax 调用,以便我可以更新数据库。

这是我尝试过的:

$(window).unload(function(){
      $.post("script.php",{key_leave:"289583002"});
});

由于某些奇怪的原因,它不起作用,我检查了 php 代码,它工作正常。有什么建议吗?

【问题讨论】:

标签: javascript jquery ajax


【解决方案1】:

试试这个:

$(window).unload(function(){
    $.ajax({
        type: 'POST',
        url: 'script.php',
        async:false,
        data: {key_leave:"289583002"}
    });
});

注意async:false,这样浏览器会等待请求完成。

使用$.post 是异步的,因此在浏览器停止执行脚本之前请求可能不够快。

【讨论】:

  • 天哪,它成功了!非常感谢,今天学到了新东西:-)
  • 上面的代码运行良好,但从 jQuery 1.8 开始,.unload() 方法是 deprecated 并替换为 $(window).on('unload', function() {});
  • 就目前而言这可能没问题,但是如果用户遇到断电等情况怎么办。最好是说“我还在这里”(心跳)而不是“我现在要离开”。
  • 主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看xhr.spec.whatwg.org
【解决方案2】:

这不是正确的方法...假设操作系统只是挂起或浏览器进程中发生了一些事情,那么这个事件将不会被触发。而且您永远不会知道用户何时离开,在他/她断开连接后显示他/她在线。取而代之的是,您可以做的是。

  1. 尝试连接一个socket,这样当socket断开时,你就可以知道用户已经断开了
  2. 您可以向服务器发送一个请求(例如每 1 秒后),这样您就可以知道用户仍处于连接状态。如果您没有收到请求 - 即使在 2 秒后 - 断开用户连接。

【讨论】:

  • 我不知道该怎么做,你有例子吗?
  • 你用什么服务器端? asp.net ?
  • 他正在使用 PHP。这是很好的源代码,可以帮助您入门github.com/nicokaiser/php-websocket 此外,它还具有 SWF 对象,用于不支持 Web 套接字的浏览器的套接字实现。
  • 很惊讶这个答案是-1。刚刚将它提高到 0。也许它写得不如它可能的好,但它提出了一个非常重要的观点并提出了解决方案。
【解决方案3】:

尝试在 $.post 之后添加弹出窗口 (prompt("Leaving so early?"))。它可能会起作用。但这可能是糟糕的用户体验。 :)

【讨论】:

  • 我怀疑它是否适用于任何变化,当浏览器关闭或只是标签正在关闭时,许多浏览器有不同的策略,甚至页面 url 被重定向到其他 url。这里最大的问题是,当页面“关闭”时,所有连接和其他东西都被处理掉了!因此,即使您在页面处理前几毫秒发送 POST 请求,连接也很有可能会被终止……这就是为什么我建议您在 $.post 函数调用后使用提示符的原因。我会尝试创建示例,但我不能承诺任何事情。
【解决方案4】:

这与上面的答案有关。 https://stackoverflow.com/a/10272651/1306144

这将每 1 秒执行一次 ajax 调用。 (1000)

function callEveryOneSec() {
    $jx.ajax({}); // your ajax call
}

setInterval(callEveryOneSec, 1000);

【讨论】:

  • 我认为每隔一秒发送一次 AJAX 可以杀死服务器,当会有很多用户时......
猜你喜欢
  • 2013-08-03
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多