如何使navigator.sendBeacon使用get方法

mad*_*han 7 javascript browser cross-domain navigator

我想在客户的网站中使用navigator.sendBeacon。但是它使用的是POST方法,并且请求未到达服务器,因为请求url的域不同。我尝试了使用sendBeacon()的不同方法,但是所有方法都使用POST方法。

  1. var data = new FormData();
    navigator.sendBeacon(myurl,data);

  2. navigator.sendBeacon(myurl,“”);

  3. navigator.sendBeacon(myurl);

有没有一种方法可以使用sendBeacon()进行GET调用?还是有任何方法可以在跨域环境中使用sendBeacon()。

Emm*_*ler 9

来自W3C 规范,浏览器实现基于该规范:

sendBeacon() 方法不提供自定义请求方法的能力。需要对此类请求进行非默认设置的应用程序应使用 FETCH API,并将 keep-alive 标志设置为 true。

根据本文档,这里有一个示例,说明如何使用 Fetch API 复制以下行为sendBeacon:

fetch(url, {
  method: ..., 
  body: ...,            
  headers: ...,       
  credentials: 'include',
  mode: 'no-cors',
  keep-alive: true,
})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您的请求不是“简单”请求;更具体地说,如果您的标头对 CORS 不友好,那么出于安全原因,也会在您的实际请求之前发出预检请求。在这种情况下,提取调用会失败,因为“当前不支持指定 keepalive 的请求的预检请求”。因此,只要您的“fetch()”+“keepalive”请求很“简单”,这个解决方案就可以使用。 (2认同)

小智 0

浏览器如何解释 sendBeacon() 似乎还没有完全标准化;有些默认通过 $_GET 发送,有些默认通过 $_POST 发送。他们应该使用第三个参数让开发人员使用 GET 或 POST 会更清楚