window.onbeforeunload,关闭浏览器并同步 AJAX

window.onbeforeunload, closing browser and synchronous AJAX

我一直在寻找任何合理的情况示例,当同步 AJAX 有意义时。我发现这个 SO question,作者在其中提到 window.onbeforeunload 并声称 "the request would never stop" 如果 AJAX 调用是异步的。

有人能解释一下吗?我的意思是 - window.onbeforeunload 当用户想要关闭选项卡时被触发。即使有人点击关闭它,必须进行什么才能使该选项卡仍然存在?有人可以举出更具体的例子吗?

他没说请求永远不会停止;他说它永远不会 完成 。也就是说,您的代码没有希望获得响应,因为执行环境(window)会在此之前消失。

window.onbeforeunload 以真值退出时,该选项卡将关闭。因此,只要是 运行,页面就在等待 return 值,而不是关闭。这允许发送同步 AJAX,并接收和处理响应。如果请求是异步的,代码构造 XHR 对象,然后退出,页面(和您的代码)消失。

我从来没有测试过这个,但回答者显然相信(我认为这不合理)页面可能不会停留足够长的时间以至于异步 XHR 甚至 sent,更不用说收到回复了。因此,如果您希望确保服务器收到用户关闭页面的信息,您希望同步请求。

What had to be going on to make the tab still alive, even though somebody clicked to close it? Can somebody give more specific example?

在卸载时发送同步 XMLHttpRequest 是在用户代理卸载页面(并且可能永远不会再次访问您的站点)时保证会话数据传送的唯一方法。有两种具体情况:

  1. 跟踪 - 跟踪和报告用户页面访问的总会话时间。
  2. 批处理 - 合并和延迟批处理会话数据的传送以减少服务器请求的数量。

Beacon spec (navigator.sendBeacon) 旨在优化此特定情况,从而可以发送保证即使在页面卸载后仍能完成的异步请求。