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

window.onbeforeunload, closing browser and synchronous AJAX

本文关键字:同步 AJAX 浏览器 onbeforeunload window      更新时间:2023-09-26

我一直在寻找同步 AJAX 有意义的情况的任何合理示例。我发现了这个问题,作者提到了window.onbeforeunload并声称,如果 AJAX 调用是异步的,"请求永远不会停止"。

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

他没有说请求永远不会停止;他说它永远不会完成。也就是说,您的代码没有希望得到响应,因为执行环境(窗口)将在发生这种情况之前消失。

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

我从未对此进行测试,但回答者显然相信(而且我认为这并非不合理)该页面可能不会停留足够长的时间以发送异步 XHR,更不用说接收响应了。因此,如果要确保服务器收到用户关闭页面的信息,则需要使请求同步。

必须

发生什么才能使选项卡仍然活着,即使有人单击关闭它?有人可以举出更具体的例子吗?

卸载

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

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

信标规范(navigator.sendBeacon)旨在优化这种特定情况,使得发送异步请求成为可能,即使在页面卸载后仍然保证仍然完成。