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

时间:2015-01-16 00:39:31

标签: javascript ajax synchronous onbeforeunload

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

有人可以解释一下吗?我的意思是 - 当用户想要关闭标签时会触发window.onbeforeunload。即使有人点击关闭它,必须要使标签仍然存在?有人可以提供更具体的例子吗?

2 个答案:

答案 0 :(得分:5)

他没有说请求永远不会停止;他说永远不会完成。也就是说,你的代码没有希望得到回复,因为执行环境(窗口)会在发生之前从存在中消失。

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

我从来没有对此进行过测试,但是应答者显然认为(并且我认为这不合理)页面可能不会长时间停留以使异步XHR甚至发送,让单独收到回复。因此,如果您想确保服务器收到用户关闭页面的信息,您希望请求同步。

答案 1 :(得分:0)

  

即使有人点击关闭它,必须要使标签仍然存在?有人可以提供更具体的例子吗?

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

  1. 跟踪 - 跟踪并报告用户页面访问的总会话时间。
  2. 批处理 - 合并和延迟批量会话数据的传送,以减少服务器请求的数量。
  3. Beacon specnavigator.sendBeacon)旨在优化此特定情况,即使在页面卸载后也可以发送保证仍然完成的异步请求。