你知道关闭页面时怎么向后台发送消息吗?

简介: 这两天碰到一个需求:在用户刷新页面或者关闭页面的时候,前端要给后台发一条请求,释放该页面的授权占用。

9.png


需求


这两天碰到一个需求:在用户刷新页面或者关闭页面的时候,前端要给后台发一条请求,释放该页面的授权占用。


分析了一下,这不就是在页面卸载时发请求嘛,三下五除二就实现一版:


window.addEventListener("beforeunload", () => {
let oReq = new XMLHttpRequest();
oReq.open("POST", "http://127.0.0.1:1991/loginout");
oReq.send(JSON.stringify({name: "编程三昧"}));


测试发现:


  • 刷新页面时基本满足需求(偶尔也会有后台接收不到请求的现象,但概率很低)
  • 关闭页面时,后台接收不到请求


既然异步 Ajax 不行,那就试试同步的吧,结果直接报错了:


3.png


搜了一下,解释如下:


Chrome now disallows synchronous XHR during page dismissal when the page is being navigated away from or closed by the user. This involves the following events (when fired on the path of page dismissal): beforeunload, unload, pagehide, and visibilitychange.


概括起来就是:对现在的 Chrome 来说,在页面导航离开或者被用户关闭时,不允许发送同步 XHR 请求,涉及到的事件有:beforeunload、unload、pagehide 和 visibilitychange。


虽然问题没解决,但是却长知识了,这波不太亏!


navigator.sendBeacon()


后来通过搜索,看到有一个接口是专门来干这事的,那就是  navigator.sendBeacon()


描述


这个方法主要用于满足统计和诊断代码的需要,这些代码通常尝试在卸载(unload)文档之前向web服务器发送数据。


语法


navigator.sendBeacon(url, data);


参数


  • url      表明 data 将要被发送到的网络地址。
  • data    参数是将要发送的 ArrayBufferView 或  BlobDOMString 或者  FormData 类型的数据。


返回值


当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false


实现


既然有了接口,那实现起来就简单了。


代码


window.addEventListener("beforeunload", (e) => {
    const data = {name: "编程三昧"};
    window.navigator.sendBeacon("http://127.0.0.1:1991/loginout", JSON.stringify(data));
});


效果


不管是刷新页面还是关闭页面,后台都能接收到前端发送过来的请求,完美实现需求。


总结


浏览器现在功能越来越强大,支持的 API 也越来越丰富,放在之前很难实现的功能,现在可能就是轻而易举的事,还是要多关注技术动态。


~本文完,感谢阅读!


学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!


你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!


知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!




相关文章
|
4月前
自动发消息程序
【7月更文挑战第7天】
34 4
|
5月前
|
存储 JavaScript 安全
JS 监听用户页面访问&页面关闭操作并进行数据上报
JS 监听用户页面访问&页面关闭操作并进行数据上报 第一次进入页面时触发页面访问 刷新当前页面时触发页面访问 新 tab 进入页面时触发页面访问 当前页面点击 nav 进入其他模块时,触发页面关闭&页面访问 关闭页面时触发页面关闭
45 0
|
6月前
如何解决由引起的IQKeyboardManager部分页面返回的键盘高度比实际小或最后收到键盘隐藏通知却显示了键盘问题
如何解决由引起的IQKeyboardManager部分页面返回的键盘高度比实际小或最后收到键盘隐藏通知却显示了键盘问题
104 0
|
JSON 前端开发 JavaScript
前端重新部署如何通知用户刷新网页?
如果后端可以配合我们的话我们可以使用webSocket 跟后端进行实时通讯,前端部署完之后,后端给个通知,前端检测到Message进行提示,还可以在优化一下使用EvnentSource 这个跟socket很像只不过他只能后端往前端推送消息,前端无法给后端发送,我们也不需要给后端发送。
176 0
前端重新部署如何通知用户刷新网页?
|
SQL 关系型数据库 MySQL
开启关闭服务器以及登录退出客户端 | 学习笔记
快速学习开启关闭服务器以及登录退出客户端。
210 1
开启关闭服务器以及登录退出客户端 | 学习笔记
|
SQL Python
DjangoAdmin后台的一些设置
DjangoAdmin后台的一些设置
103 0
|
Web App开发 监控 前端开发
Web Beacon 刷新/关闭页面之前发送请求
背景: 有一个任务非常耗时会消耗后台大量算力,所以在退出页面的时候,要求前端这边发送一个请求来杀死任务。 一开始以为这个需求非常简单,就是在进入其他路由前,发送一下请求,杀死一下任务就好了。 然而现实狠狠的打了我的脸,因为退出页面的场景不止切换路由~ 退出页面场景: 还在本网站,跳到其他路由 刷新页面/关闭页面也需要发送请求来杀死任务 还在本网站,跳到其他路由 这个比较简单,在Vue中可以通过路由离开的钩子beforeRouteLeave来实现: beforeRouteLeave(to, from, next) { if (任务运行中) { // 发送请求
291 0
Web Beacon 刷新/关闭页面之前发送请求
|
前端开发
关闭页面向后台发送消息
关闭页面向后台发送消息
|
SQL 关系型数据库 MySQL
开启关闭服务器以及登录退出客户端|学习笔记
快速学习开启关闭服务器以及登录退出客户端
开启关闭服务器以及登录退出客户端|学习笔记
循环定时向qq对话框中发送消息
实现在一个及多个qq窗口定时循环发送消息
2245 0