Javascript 如何检测访问者是否仍在网站上(除了轮询)?

Javascript 如何检测访问者是否仍在网站上(除了轮询)?,javascript,html,Javascript,Html,是否有一种简单的方法可以检测访问者是否仍在查看不需要每隔X秒轮询服务器的网页 如果服务器上有一些不那么麻烦的东西,那将是理想的。使用 反向Ajax指的是Ajax设计 使用长寿命HTTP的模式 连接以实现低延迟 web服务器与服务器之间的通信 浏览器。基本上,这是一种 将数据从客户端发送到服务器和 推送服务器数据的机制 返回浏览器 在web开发中,Comet是一种 描述网络的新词 应用程序模型,其中 HTTP请求允许web服务器 将数据推送到浏览器,而不使用 浏览器显式请求它。 彗星是多个行星

是否有一种简单的方法可以检测访问者是否仍在查看不需要每隔X秒轮询服务器的网页

如果服务器上有一些不那么麻烦的东西,那将是理想的。

使用

反向Ajax指的是Ajax设计 使用长寿命HTTP的模式 连接以实现低延迟 web服务器与服务器之间的通信 浏览器。基本上,这是一种 将数据从客户端发送到服务器和 推送服务器数据的机制 返回浏览器

在web开发中,Comet是一种 描述网络的新词 应用程序模型,其中 HTTP请求允许web服务器 将数据推送到浏览器,而不使用 浏览器显式请求它。 彗星是多个行星的总称 实现这一目标的技术 相互作用所有这些方法都依赖于 默认情况下包含在中的功能 浏览器,如JavaScript,而不是 而不是非默认插件


您可以使用javascript on_exit事件触发ajax事件,打开带有跟踪器的弹出窗口,或者执行其他类似操作。只有当用户点击离开页面,而不是关闭窗口时,这些方法才有效。

其他答案中提出的技术解决方案就其本身而言是不错的,但我想知道它们对根本问题的回答有多好

现在,我打开了4个Safari窗口,总共有17个选项卡;还有一个镀铬护目镜,有4个标签。我不清楚为什么我目前没有打开任何Firefox(可能只是最近升级到3.5.4后忘记重新启动),但通常会有2-3个窗口,还有8-10个选项卡。我是否“仍在浏览”这30多个网页——同时。。。?从技术上讲,我想你会发现每一个基于编程的解决方案都会说,为什么,是的,我当然是。。。这对你有意义吗

在现实生活中,我可能(也许,除非我在电脑上再次做其他事情)在给定的时间查看其中一个网页——如果我有多个或非常大的屏幕,可能是2-3个,但一般来说,1是现实生活中明智的答案。哪一个?如果没有强大的Javascript魔力,你是不会发现的

这是一个非常困难的问题,添加而不是的奇怪约束,让神奇的Javascript周期性地告诉服务器“我仍然打开,看起来用户正在查看我[[在过去XX秒内发生了一些交互,或者…]”vs“我是打开的,但我怀疑我在后台,或者用户离开去吃午饭,让浏览器保持打开状态,因为从YYY秒前开始就没有任何交互”vs“我正在被导航离开”(没有消息表示整个浏览器崩溃或其他情况)--加上奇怪的约束,基本上保证了问题是完全无法解决的


如果你真的关心用户是否真的在查看页面,那么每隔几秒钟就有一次从Javascript到服务器的定期Ajax交互只需付出很小的代价,而且实际上你的问题最少。如果你不真正关心,那当然不一样了。也许可以告诉我们你遇到了什么实际问题e真的想解决问题吗?

最简单的方法(也是流量最轻的方法)是跟踪页面上的鼠标移动/按键事件。比如说,在上次移动鼠标后的1分钟内,你可以确定用户确实在网站上做了什么(例如,没有在午餐时打开窗口).

那么你是说,当窗口关闭时,服务器会立即注意到缺少HTTP连接?反向AJAX连接是否必须轮询服务器以保持连接打开?如果是,它不能完全回答问题…我有一个LAMP堆栈。使用LAMP是否可以反向AJAX?(假设有大量访问者)太好了!我如何设置一个页面来执行反向AJAX或COMET?我之前一直避免使用它,因为我认为Apache在访问了几百个访问者之后会感到紧张。另外,反向AJAX和COMET是一样的吗?@chris:请记住,虽然它提供的压力比完全加载页面要小,但COMET技术仍然会使用套接字和reso通过定期为每个打开的页面轮询一个keepalive信号来在服务器上搜索资源。这是针对社交网络的,因此了解此人当前是否“可用”很重要“@chris,因此,网页是否仍在某个被遗忘已久的标签中打开,在一个深埋的窗口中,这并不是真正有意义的——因此,你确实需要JS magic Wannab,因此,不可避免地,JS会定期或根据需要向服务器发送状态更新(服务器必须注意,JS上次发送状态更新是在多长时间之前)“用户在此页面上实际处于活动状态”状态更新)。