Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript window.onbeforeunload,关闭浏览器和同步AJAX_Javascript_Ajax_Synchronous_Onbeforeunload - Fatal编程技术网

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

Javascript window.onbeforeunload,关闭浏览器和同步AJAX,javascript,ajax,synchronous,onbeforeunload,Javascript,Ajax,Synchronous,Onbeforeunload,我一直在寻找任何一个合理的例子,当同步AJAX有意义时。我发现了这一点,作者提到了window.onbeforeunload,并声称如果AJAX调用是异步的,“请求永远不会停止” 有人能解释一下吗?我的意思是-window.onbeforeuload在用户想要关闭选项卡时被激发。即使有人点击关闭了它,到底是什么让这个标签还活着?有人能举个更具体的例子吗?他没有说这个请求永远不会停止;他说它永远不会完成。也就是说,您的代码不可能再得到响应,因为执行环境(窗口)将在响应发生之前消失 当window.

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


有人能解释一下吗?我的意思是-
window.onbeforeuload
在用户想要关闭选项卡时被激发。即使有人点击关闭了它,到底是什么让这个标签还活着?有人能举个更具体的例子吗?

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

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

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

即使有人点击关闭了它,到底是什么让这个标签还活着?有人能举个更具体的例子吗

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

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

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

    浏览器关闭窗口,从该窗口发出的任何请求都将消失。尼克·克雷弗在他的帖子里这么说。
    beforeunload
    中的Synchronous
    httpRequest
    将停止脚本执行,防止卸载发生,直到请求得到解决。@Mouser啊,我想我明白了。因此,当用户单击“关闭窗口”时,将触发
    beforeunload
    事件。它包含一些AJAX调用。在异步情况下,调用将被触发,它的成功回调将被延迟,直到服务器响应到达,脚本将继续并立即终止。对于同步AJAX,整个脚本都被冻结,以确保响应到达,然后窗口安全关闭。是吗?@tkoomzaaskz:完全正确。这很难,但我终于明白了。但你能举一个真实的例子吗?假设我必须从服务器获得响应,那么在关闭选项卡时需要触发什么AJAX调用?需要触发什么AJAX调用?我不知道。如果你创建了一个论坛,你可能希望跟踪“在线用户”,并在用户关闭你的窗口时将其从列表中删除。如果你是连环杀手,当用户关闭你的窗口时,你可能会远程触发炸弹。取决于您的应用程序。(免责声明:我不允许在卸载前从
    触发炸弹。不要这样做。)