我想在用户关闭浏览器窗口时通知服务器。
我尝试了所有的
$(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'
});
}
);
答案 0 :(得分:4)
这非常棘手,因为浏览器不会等到响应到来,因此ajax请求可能会中止。
你可以在beforeunload事件中尝试这样的事情。
$(window).bind("beforeunload", function() {
$.ajax({
async: false,//This will make sure the browser waits until request completes
url: "${contextPath}/notify?direction=logout"
});
});
答案 1 :(得分:2)
其他答案已过时,并引起其他问题,例如信号不可靠或延迟下一页的加载。
最好的解决方案是使用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 处理程序。
为解决此问题,分析和诊断代码具有 历史上在卸载时进行了同步XMLHttpRequest调用,或者 beforeunload事件处理程序提交数据。同步 XMLHttpRequest阻止了文档的卸载过程, 转弯会导致下一个导航速度变慢。什么也没有 下一页可以避免这种页面加载不良的感觉 性能,结果是用户感知到新的 网页加载缓慢,即使真正的问题出在 前一页。
答案 2 :(得分:1)
即使这是可能的,我仍然不会推荐它。 如果您设法使其工作,它将无法在所有浏览器中工作,我仍然会完全反对它。
如果您非常想知道用户何时离开您的域名,请使用带回退的轮询或websockets。
你也可以给cookie一个短暂的超时,并在网站上定期更新它们,这样的技巧甚至会起作用。
此外,它在跟踪时“开始”工作,因为事件在下一页开始加载之前被触发。已经有一段时间了,但是上次我玩这些事件时,有些浏览器可能会在下一页加载时执行一段时间的代码。
答案 3 :(得分:0)
你运气不好,如果在页面卸载时执行的JavaScript被阻止,用户就不可能退出页面。
想象一下所有的垃圾邮件。
在某些浏览器上,会触发unload事件,但在脚本和页面清理之间会出现争用情况。
由于
答案 4 :(得分:0)
我不想将此作为评论,因为我正在研究这个问题 情景很久以前回来了。我会将所有信息保存到服务器 当最终用户意外或故意关闭浏览器时。一世 会告诉你..它工作得很好。
我说工作很好吗?好吧,它只适用于Firefox和IE。它 许多其他浏览器(如Opera,Safari)都失败了。所以我的建议不是依赖于这些功能 仅限浏览器。