MOXUY

Jun 25, 2022

在跳转页面前发送HTTP请求

在不考虑用户体验的情况下很好处理,直接等待请求完成再跳转

Fetch

请求如果使用fetch即可使用keepalive属性

keepalive 选项表示该请求可能会在网页关闭后继续存在。

1
2
3
4
5
6
7
fetch('/log', {
method: 'POST',
header: {
'Content-Type': 'application/json'
},
keepalive: true
})

a标签

a标签中有一个ping属性也可以实现类似的效果

包含一个以空格分隔的 url 列表,当跟随超链接时,将由浏览器 (在后台) 发送带有正文 PING 的 POST 请求。通常用于跟踪。

但是在response的headers中会暴露跳转前和跳转后的地址

1
2
3
4
5
6
7
{
"headers": {
"ping-from": "", // 跳转前的url
"ping-to": "", // 跳转后的url
// ...other
}
}

navigator.sendBeacon() 方法可用于通过 HTTP POST 将少量数据 异步 传输到 Web 服务器。

关闭或跳转页面时使用这个方法也是被推荐的

1
2
3
4
5
6
7
8
// 页面在被隐藏或者关闭时触发
document.addEventListener('visibilitychange', function logData() {
if (document.visibilityState === 'hidden') {
// 支持ArrayBuffer、ArrayBufferView、Blob、DOMString、FormData 或 URLSearchParams 类型的数据
const analyticsData = new Blob([JSON.stringify({ username: "tim" })], { type: 'application/json; charset=UTF-8' });
navigator.sendBeacon('/log', analyticsData);
}
});

这样会在页面在被隐藏或者关闭时向目标url发送一个post请求

tags: Javascript
OLDER > < NEWER