6

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

我尝试了所有的

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

5 回答 5

22

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

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

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log", analyticsData);
}

此方法旨在用于分析和诊断代码以将数据发送到服务器。

发送分析的一个问题是,网站通常希望在用户完成页面后发送分析:例如,当用户导航到另一个页面时。在这种情况下,浏览器可能即将卸载页面,在这种情况下,浏览器可能会选择不发送异步 XMLHttpRequest 请求。

过去,网页试图将页面卸载延迟足够长的时间以发送数据。为此,他们使用了一些变通方法,例如:

  • 使用阻塞同步 XMLHttpRequest 调用提交数据。
  • 创建一个元素并设置它的 src。大多数用户代理会延迟卸载以加载图像。
  • 创建几秒钟的无操作循环。

所有这些方法都会阻止卸载文档,这会减慢导航到下一页的速度。下一页无法避免这种情况,因此新页面看起来很慢,即使这是前一页的错。

使用 sendBeacon() 方法,当用户代理有机会异步传输数据时,不会延迟卸载或下一次导航。这表示:

  • 数据可靠发送
  • 它是异步发送的
  • 不影响下一页的加载
于 2018-06-25T11:31:35.373 回答
5

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

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

$(window).bind("beforeunload", function() {
    $.ajax({
        async: false,//This will make sure the browser waits until request completes
        url: "${contextPath}/notify?direction=logout"
    });
});
于 2012-02-10T22:22:58.733 回答
1

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

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

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

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

于 2012-02-10T22:45:22.080 回答
0

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

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

在某些浏览器上,会触发 unload 事件,但在您的脚本和页面清理之间会发生竞争条件。

谢谢

于 2012-02-10T22:21:23.077 回答
0

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

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

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

于 2012-02-10T22:25:20.413 回答