Navigator.sendBeacon()数据大小限制

时间:2015-03-11 14:42:50

标签: javascript google-chrome firefox navigator

我想使用相当新的beacon api。我在网上搜索但我无法找到数据,发送数据的大小限制是多少。 在参考文献中它写了它的意思是少量的数据,但我必须知道有多少...

2 个答案:

答案 0 :(得分:8)

最大大小(如果已设置)将取决于用户代理(浏览器或其他)。

请参阅http://www.w3.org/TR/beacon/#sec-sendBeacon-method

您可以通过创建可变长度data的字符串(从N的任意高值开始,并使用二进制文件)轻松地为网页中的N大小限制创建测试搜索),并检查sendBeacon的返回值(根据规范,sendBeacon在超出用户代理数据限制时返回false

例如,我使用此方法确认在Windows 7的Chrome 40中,限制为655362^16)。

示例代码(没有n的二进制搜索):

var url = 'http://jsfiddle.net?sendbeacon';
var n = 65536; // sendBeacon limit for Chrome v40 on Windows (2^16)

// this method courtesy of http://stackoverflow.com/questions/14343844/create-a-string-of-variable-length-filled-with-a-repeated-character
var data = new Array(n+1).join('X'); // generate string of length n

if(!navigator.sendBeacon(url, data))
{
   alert('data limit reached');
}

答案 1 :(得分:1)

回答Zbun's question in comment

简而言之,sendBeacon()请求队列的总字节大小以及单个sendBeacon()请求的有效负载大小都有限制。

正如nothingisnecessary的回答中提到的,W3C spec说:

  

用户代理必须在设置了keepalive标志的情况下启动提取,这限制了这些请求可以排队的数据量,以确保信标请求能够快速,及时地完成。

这仍然保留了每个实现的实际字节大小限制,目前大多数浏览器通常为64KB。

同样在相关的GitHub问题Enforce payload limits via Fetch API #39中,提到传输中的有效负载的字节大小已计数并具有类似的限制。您可以查看Chromium的测试文件,看看64KB是Chromium的限制,并且与您指出的完全相同的行为(超出限制后的后续请求)是合适的。

https://chromium.googlesource.com/chromium/src/+/c1a211aa583ade023aca652e9493c01603623aa3/third_party/WebKit/LayoutTests/http/tests/sendbeacon/beacon-allowance-limit.html