navigator.sendBeacon 与 application/x-www-form-urlencoded

4 javascript ajax onbeforeunload

我正在尝试使用 发送事件POST请求,但数据未到达 PHP 。我认为这是因为使用时标头始终设置为,但在我的情况下,因为我需要发送查询字符串,因此使用.beforeunloadnavigator.sendBeacon$_POSTnavigator.sendBeaconContent-Typetext/plain;charset=UTF-8application/x-www-form-urlencoded

var amountOfApples = 0;

...

addEventListener("beforeunload", function(e) {
    navigator.sendBeacon("save.php", "key=apples&value=" + amountOfApples);
});
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点并确保标题设置为application/x-www-form-urlencoded

Zam*_*ara 7

Content-TypeBeacon API 使用的标头取决于传递给sendBeacon第二个参数的实例类型。

应用程序/x-www-form-urlencoded

要发送application/x-www-form-urlencoded,请使用UrlSearchParams实例。

var params = new URLSearchParams({
   key : 'apples',
   values : amountOfApples
});
navigator.sendBeacon(anUrl, params);
Run Code Online (Sandbox Code Playgroud)

多部分/表单数据

要发送multipart/form-data标头,请使用FormData实例。

var params = new FormData();
params.append('key', 'apples');
params.append('value', amountOfApples);
navigator.sendBeacon(anUrl, params);
Run Code Online (Sandbox Code Playgroud)

应用程序/json

要发送application/json标头,请使用Blob并设置其类型。

var data = {
   key : 'apples',
   values : amountOfApples
};

var params = new Blob(
    [JSON.stringify(data)], 
    {type : 'application/json'}
);
navigator.sendBeacon(anUrl, params);
Run Code Online (Sandbox Code Playgroud)

  • 由于 [Bug 747787](https://bugs.chromium.org/p/chromium/issues/detail?id=747787),_Chrome 将 URLSearchParams 作为 text/plain 而不是 application/x-www-form-urlencoded 发送,因此使用可能需要 Blob。_ – 取自 [Kevin](https://kevinlocke.name/bits/2019/07/30/more-robust-javascript-error-reporting/)。 (4认同)