Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/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 sendBeacon请求被卡为“;(待定)“;当附加到卸载事件时_Javascript - Fatal编程技术网

Javascript sendBeacon请求被卡为“;(待定)“;当附加到卸载事件时

Javascript sendBeacon请求被卡为“;(待定)“;当附加到卸载事件时,javascript,Javascript,当我在控制台中直接调用navigator.sendBeacon时,我立即在Chrome开发工具网络窗格中看到请求成功完成 当我使用下面的代码将sendBeacon附加到beforeunload事件,然后导航到页面之外时,我看到网络窗格中添加了一行,但其状态保持为“(挂起)”且从不发送 我做错了什么 window.addEventListener('beforeunload', function() { navigator.sendBeacon( 'https://www.

当我在控制台中直接调用navigator.sendBeacon时,我立即在Chrome开发工具网络窗格中看到请求成功完成

当我使用下面的代码将sendBeacon附加到beforeunload事件,然后导航到页面之外时,我看到网络窗格中添加了一行,但其状态保持为“(挂起)”且从不发送

我做错了什么

  window.addEventListener('beforeunload', function() {
    navigator.sendBeacon(
      'https://www.example.com/sendBeacon-data-collector',
      'Sent by a beacon!');
  }, false);

您说该连接被卡在“挂起”位置,并且从未发送。如果它没有发送,连接将根本不会显示在网络窗格中,因此这确认它确实发送了

至于被困在“待定”的状态,这似乎是预期的行为(我仅通过观察以经验证明了这一点)。根据定义,sendBeacon命令不需要应答,因此我假设浏览器不显示连接是否工作是正常的,因为它从不从服务器读取可能的应答(我只是猜测)

无论如何:我的web应用程序中有一个sendBeacon,它可以将最后的数据保存到数据库中,该数据库尽管处于“挂起”状态,但运行正常。因此,如果您的数据没有到达,问题可能出在其他地方

例如,您需要确保以正确的格式发送数据。为了使它与从HTML表单读取数据的脚本兼容,您不能简单地发送JSON字符串,但需要将该字符串放入formdata(否则只能从服务器端的原始post数据获取)

例如:

    var fd = new FormData();
    fd.append('data', JSON.stringify(beaconData));
    navigator.sendBeacon("inc/php/saveData.php", fd);

您还需要注意,sendBeacon始终通过POST参数发送数据。如果要使用GET,您需要自己在url中添加数据。

AFAIK,当您启动
navigator.sendBeacon()
时,您不希望从服务器收到任何响应。您只需在页面完全卸载之前将浏览器发出的请求“排队”


检查请求是否正确排队的一种方法是查看
sendBeacon()
方法是否返回
true
false
。如果
true
,则您的请求已正确排队,并应保证由浏览器运行。如果
为false
,则表示未正确排队。更多详情请参见此。

我也遇到了同样的问题。我有一个Node/Express服务器,用来收集请求的记录。我在用一台没有数据的计算机进行测试

数据可以作为ArrayBuffer、ArrayBufferView、Blob、DOMString、FormData或URLSearchParams对象发送。所以,这不是问题所在

问题出在我的服务器上。我使用的是
app.get()
来检查请求,而不是
app.post()

所有sendBeacon请求均通过POST发送

它们将始终在Chrome开发工具网络选项卡中显示为挂起。 它们将始终显示文本/html响应为空


sendBeacon请求将通过POST发送。它可以通过“卸载”或“卸载前”触发。

对我来说也是同样的问题。你找到答案了吗?我不确定数据是否像你提到的那样发送,我也有同样的问题,网络日志说:
Method:POST;状态:(待定);尺寸:0B;待决时间;在0排队;从0开始;连接开始:暂停
我想这意味着连接从未启动。在我的情况下,它确实发送了:我让PHP脚本将数据写入文本文件,以便我可以验证服务器是否收到了数据。这可能是因为我在angular4 SPA上使用它吗?不幸的是,我从未使用过angular4的任何版本,所以我甚至不能对这件事做出有根据的猜测。抱歉。请提供
的源代码,它们在Chrome开发工具网络选项卡中将始终显示为挂起。它们将始终显示文本/html响应为空。
。这大概就是其他答案所说的,以及悬赏的目的。这是我做的关于这个主题的教程-隐私设置不允许查看。对不起。该视频定于周三发布。我还以为我上周发布了呢。它解释了与我上面所说的相同的事情,但更详细。这是sendBeacon的规格-。在注释部分,它表示服务器不会提供响应。Chrome显示的“挂起”状态表示请求已启动,但尚未返回任何内容。