简短回答:该问题已经在2021年得到解决。
详细回答(背景):我曾经在开发timeonsite JS时遇到了这个问题。它在Chrome、Firefox和许多其他浏览器中都能正常工作。但是,几个月后,突然出现了上述的CORS白名单错误,导致我们无法实时保存站点数据。这迫使我们退回到Localstorage,这将导致每个用户会话期间(N-1)页视图和随后的损失的网站停留时间数据,这是一个关键的网络分析指标。我们一直在期待浏览器供应商解决这个问题。这是我们用于捕获实时数据的配置,直接依赖于sendBeacon() API。
<script type="text/javascript">
var Tos;
(function(d, s, id, file) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.onload = function() {
var config = {
trackBy: 'seconds',
callback: function(data) {
console.log(data);
var endPointUrl = 'http://localhost:4500/tos';
if (data && data.trackingType) {
if (data.trackingType == 'tos') {
if (Tos.verifyData(data) != 'valid') {
console.log('Data abolished!');
return;
}
}
if (navigator && typeof navigator.sendBeacon === 'function') {
data.trasferredWith = 'sendBeacon';
var blob = new Blob([JSON.stringify(data)], {type : 'application/json'});
navigator.sendBeacon(endPointUrl, blob);
}
}
}
};
if (TimeOnSiteTracker) {
Tos = new TimeOnSiteTracker(config);
}
};
js.src = file;fjs.parentNode.insertBefore(js, fjs);
} (document, 'script', 'TimeOnSiteTracker', 'https://cdnjs.cloudflare.com/ajax/libs/timeonsite/1.1.0/timeonsitetracker.min.js'));
</script>
正如您在上面看到的,由于CORS安全列表问题,我们过去几年一直注释掉了sendBeacon()代码块,并依赖于XMLHTTPRequest和async=false来发布数据,这是一种阻塞方法,在许多浏览器上特别是移动设备上并不太可靠。
最近,浏览器供应商似乎已经解决了这个问题,sendBeacon() API可以再次使用。我测试了许多浏览器,它似乎工作得很好。因此,该问题被标记为“已解决”截至2021年。我希望您添加那些适用于beforeunload/unload窗口事件的版本/年份明确提及的设备/浏览器。
sendBeacon()
再次无法正常工作。 - jumping_monkey