没有时间在窗口卸载时发送get请求

我想在用户关闭浏览器窗口时通知服务器。

我尝试了所有的

$(window).bind("beforeunload", function() { $.get("${contextPath}/notify?direction=logout"); }); 

 $(window).unload( function() { $.get("${contextPath}/notify?direction=logout"); }); 

 $(window).unload(function() { $.ajax({ url: "${contextPath}/notify?direction=logout" }); }); 

但是,尽管事实上在手册中说它可能应该这样做,但它们都不能很好地工作。

在Firefox中,我只在窗口关闭时没有通知,但在页面刷新时有一些通知。 在Chrome中我没有。

我试图在Firebug或Chrome开发者工具中跟踪这个脚本,发现如果跟踪它就会开始工作! 所以我认为它不能正常工作,因为它没有时间在窗口关闭或导航之前发送请求。

这是真的? 如何完成我的任务?

这工作:

 $(window).bind("beforeunload", function() { $.ajax({ async: false, url: 'notify' }); } ); 

这非常棘手,因为浏览器不会等待,直到响应到来,因此ajax请求可能会中止。

您可以在beforeunload事件中尝试这样的事情。

 $(window).bind("beforeunload", function() { $.ajax({ async: false,//This will make sure the browser waits until request completes url: "${contextPath}/notify?direction=logout" }); }); 

即使这是可能的,我仍然不会推荐它。 如果您设法使其工作,它将无法在所有浏览器中工作,我仍然建议完全反对它。

如果您非常想知道用户何时离开您的域,请使用带有后备的轮询或websockets。

你也可以给cookie一个短暂的超时,并使用间隔在网站上定期更新它们,这样的技巧甚至可以工作。

此外,它在跟踪时“开始”工作,因为事件在下一页开始加载之前被触发。 已经有一段时间了,但是上次我玩这些事件时,有些浏览器可能会在下一页加载时执行一段时间的代码。

其他答案已过时,并导致其他问题,例如不可靠的信号或延迟下一页的负载。

最好的解决方案是使用navigator.sendBeacon : https : //developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon

 window.addEventListener("unload", logData, false); function logData() { navigator.sendBeacon("/log", analyticsData); } 

此方法满足分析和诊断代码的需要,这些代码通常在卸载文档之前尝试将数据发送到Web服务器。 更快地发送数据可能会导致错过收集数据的机会。 但是,确保在卸载文档期间已经发送数据对于开发人员来说传统上是困难的,因为用户代理通常忽略在卸载处理程序中进行的异步XMLHttpRequests。

为解决此问题,分析和诊断代码历史上在卸载或beforeunload事件处理程序中进行同步XMLHttpRequest调用以提交数据。 同步XMLHttpRequest阻止卸载文档的过程,这反过来导致下一个导航看起来更慢。 下一页无法避免这种对页面加载性能不佳的看法,结果是用户感觉到新网页的加载速度很慢,即使真正的问题出在上一页上。

你运气不好,如果在页面卸载时执行的JavaScript被阻止,用户就不可能退出页面。

想象一下所有的垃圾邮件。

在某些浏览器上,将触发unload事件,但在脚本和页面清理之间会出现争用情况。

谢谢

我不想将此作为评论,因为我很长一段时间都在研究这种情况。 当最终用户意外或故意关闭浏览器时,我会将所有信息保存到服务器。 我会告诉你..它工作得很好。,

我说工作很好吗? 好吧,它只适用于Firefox和IE。 它在许多其他浏览器(如Opera,Safari)中失败了。

所以我的建议不是依赖于这些function,因为它们只是特定于浏览器。