Sco*_*y H 5 javascript window onbeforeunload onunload navigator
我一直在努力编写代码,在关闭选项卡窗口时可靠地发出POST请求.Navigator.sendBeacon似乎正是我需要的(我只要求它适用于谷歌Chrome).
$(global).bind('unload', function () {
let body = {
UserEmail: appState.user.email,
Job: {
Id: appState.jobId
},
Timestamp: '/Date(' + new Date().getTime() + ')/',
EventOrigin: 'PdfReviewClient',
Event: 'JobClosed'
};
let headers = {
Authorization: `JWT ${authenticationState.token}`,
'Content-Type': 'application/json; charset=utf8'
};
let blob = new Blob([JSON.stringify(body)], headers);
navigator.sendBeacon(configuration.rootApiUrl + 'jobevents', blob);
});
Run Code Online (Sandbox Code Playgroud)
我的灯塔包括自定义标题,这就是我创建Blob的原因.
但是,这个请求似乎没有发生.由于窗口关闭,这尤其难以调试.所以问题是,为什么我的灯塔不发送?
问题是您可以设置的唯一标头是 Content-Type,并且您可以通过在 Blob 选项中navigator.sendBeacon进行设置来设置它。type必须修改服务器路由以适应没有授权标头的请求(我将其作为 URL 参数传递 - 对于 POST 请求来说很奇怪,但似乎是使用信标实现这一点的唯一方法)。最终的样子是这样的:
$(global).bind('unload', function () {
if(appState.jobId == null) return;
let headers = {
type: 'application/json'
};
let jobEventLoggingBody = {
UserEmail: appState.user.email,
Job: {
Id: appState.jobId
},
Timestamp: '/Date(' + new Date().getTime() + ')/',
EventOrigin: 'PdfReviewClient',
Event: 'JobClosed'
};
let jobEventLoggingUrl = `${configuration.rootApiUrl}jobevents?jwt=${authenticationState.token}`;
let jobEventLoggingBlob = new Blob([JSON.stringify(jobEventLoggingBody)], headers);
navigator.sendBeacon(jobEventLoggingUrl, jobEventLoggingBlob);
});
Run Code Online (Sandbox Code Playgroud)
另请参阅此问题,该问题专门解决了信标中发送标头的问题。
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |