JavaScript,浏览器,窗口关闭 - 发送AJAX请求或在窗口关闭时运行脚本

zoz*_*ozo 27 javascript browser window dom-events

我试图找出用户何时离开指定页面.找到他在页面内部使用链接导航时没有问题,但我需要标记一些内容,例如当他关闭窗口或输入另一个URL并按下回车时.第二个不是那么重要,但第一个是.所以这是一个问题:

我怎么能看到用户何时关闭我的页面(捕获window.close事件),然后......并不重要(我需要发送一个AJAX请求,但如果我能让它运行警报,我可以做其余的).

Fel*_*lix 37

unloadbeforeunloadjavascript事件,但这些对于Ajax请求是不可靠的(不能保证在其中一个事件中启动的请求将到达服务器).

因此,强烈建议要这样做,您应该寻找替代方案.

如果您确实需要这个,请考虑使用"ping"式解决方案.每分钟发送一个请求,基本上告诉服务器"我还在这里".然后,如果服务器没有收到超过两分钟的请求(您必须考虑延迟等),您认为客户端脱机.


另一种解决方案是使用unloadbeforeunload执行Sjax请求(同步JavaScript和XML),但完全不推荐这样做.这样做基本上会冻结用户的浏览器,直到请求完成,这是他们不喜欢的(即使请求花费的时间很少).

  • 不,我敢打赌,那里有弹出窗口阻止程序,这些事件不允许弹出窗口。同样,当用户关闭标签页/窗口时,打开一个弹出窗口也很糟糕。 (2认同)

Use*_*gle 22

1)如果您正在寻找在所有浏览器中工作的方法,那么最安全的方法是将同步AJAX发送到服务器.这不是一个好方法,但至少要确保您没有向服务器发送太多数据,并且服务器速度很快.

2)您还可以使用异步AJAX请求,并在服务器上使用ignore_user_abort函数(如果您使用的是PHP).但是,ignore_user_abort在很大程度上取决于服务器配置.确保你测试得好.

3)对于现代浏览器,您不应发送AJAX请求.您应该使用新的navigator.sendBeacon方法异步发送数据到服务器,而不会阻止下一页的加载.由于您希望在用户移出页面之前将数据发送到服务器,因此您可以在卸载事件处理程序中使用此方法.

$(window).on('unload', function() {
    var fd = new FormData();
    fd.append('ajax_data', 22);
    navigator.sendBeacon('ajax.php', fd);
});
Run Code Online (Sandbox Code Playgroud)

似乎还有一个sendBeacon的polyfill.如果方法本身不可用,它会转向发送同步AJAX.

移动设备的重要事项:请注意,不保证会为移动设备触发卸载事件处理程序.但是可以保证可以触发visibilitychange事件.因此,对于移动设备,您的数据收集代码可能需要进行一些调整.

您可以参考我的博客文章,了解所有3种方式的代码实现.


Bai*_*shu 19

基于其他答案.

为了说清楚,在2018年,Beacon API是解决这个问题的解决方案(几乎在所有浏览器上)

保证在卸载页面之前启动信标请求,并且它们运行完成,而不需要阻止请求.

您可以在onunload活动中使用它,并确信它将被发送.

$(window).on('unload', function() {

    var URL = "https://example.com/foo";
    var data = "bar";

    navigator.sendBeacon(URL, data);

});
Run Code Online (Sandbox Code Playgroud)

伟大的博客文章:http://usefulangle.com/post/62/javascript-send-data-to-server-on-page-exit-reload-redirect

Beacon API:https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API/Using_the_Beacon_API

  • 这个答案改变了我的生活!多谢! (4认同)