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

时间:2012-02-10 22:16:21

标签: javascript jquery notifications onbeforeunload onunload

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

我尝试了所有的

$(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'
        });
    }
);

5 个答案:

答案 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.sendBeaconhttps://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)都失败了。

     

所以我的建议不是依赖于这些功能   仅限浏览器。