Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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 在窗口关闭时发送通知_Javascript_Xmlhttprequest - Fatal编程技术网

Javascript 在窗口关闭时发送通知

Javascript 在窗口关闭时发送通知,javascript,xmlhttprequest,Javascript,Xmlhttprequest,我有一个web应用程序,当窗口关闭时,我试图向服务器发送通知。到目前为止,我发现最好的方法是在onunload中使用同步xhr(因为异步是不可靠的)。以下是目前的代码: window.onunload = function() { var req = new XMLHttpRequest(); req.open('GET', '/api/v1/' + id + '/close?resource=' + JSON.stringify(resource), false

我有一个web应用程序,当窗口关闭时,我试图向服务器发送通知。到目前为止,我发现最好的方法是在onunload中使用同步xhr(因为异步是不可靠的)。以下是目前的代码:

    window.onunload = function() {
      var req = new XMLHttpRequest();
      req.open('GET', '/api/v1/' + id + '/close?resource=' + JSON.stringify(resource), false);
      req.setRequestHeader('Authorization', localStorage.token);
      req.send();
    }

唯一的问题是当他们重新加载页面时,页面会冻结一点(我认为这是由于xhr)。是否有更好的方法在窗口关闭时向服务器发送通知?

您正在查找卸载前
事件。
unload
事件实际上发生在用户返回页面时(因为该事件在网页关闭时无法触发,也不能在用户关闭选项卡之前触发,因为文档尚未卸载)

另外一个有用的技巧是以URL兼容的格式对JSON进行编码:
encodeURIComponent(JSON.stringify(resource))


请参见此处:

我认为更好的解决方案是使用
Navigator.sendBeacon
作为新浏览器(Chrome、Opera和Firefox),因为它是异步的,并且浏览器向您承诺将发送请求

此方法解决了分析和诊断代码的需求,这些代码通常试图在卸载文档之前将数据发送到web服务器

您可以在这里找到更多信息:


Polyfill:

有趣的是,Polyfill与发布的代码非常相似,即同步请求。然而,OP仍然需要在beforeunload事件中调用它。IE上似乎不支持它。我最初使用的是beforeunload,但beforeunload中发送的XHR请求如果是异步的(即使我不指望返回值),则似乎不可靠,如果是同步的,则包含与onunload相同的问题,因为刷新页面会冻结所有内容。