需求

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

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

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

测试发现:

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

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

搜了一下,解释如下:

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 参数是将要发送的 ArrayBufferViewBlobDOMString 或者 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 也越来越丰富,放在之前很难实现的功能,现在可能就是轻而易举的事,还是要多关注技术动态。

~

~本文完,感谢阅读!

~

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

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

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

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

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

  1. session 安全问题(关闭页面时自动清除session)

    要是直接关闭浏览器,并不直接触发SESION_ONEND事件,因此为了安全的需要,就需要调用页面关闭触发的事件onUnload ,利用这个事件来执行一个函数.在函数中调用session.abandon ...

  2. js 关闭页面时弹框提醒

    关闭页面时弹框提醒 在做vue项目时一个可编辑的详情页面需要在离开它的时候,根据页面是否改动的情况来判断是否要离开页面,一开始我只是在beforeRouteLeave里面调用的==window.con ...

  3. 关闭页面时向后台发送消息

    语法: navigator.sendBeacon(url, data); 返回值: 当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false. 代码: ...

  4. 关闭页面时执行“退出”的解决方案

    在有些应用中我们需要实时的更新站点用户是否在线的状态.比如一些论坛里的在线成员实时显示,或基于网页的聊天.会议系统等.这种情况下,如果用户点击"退出"按钮或链接,我们将之行一系列后 ...

  5. JavaScript的onunload()方法在关闭页面时不执行

    以下仅确定适用于IE11. 解决办法:将onunload()方法换为onbeforeunload(). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  6. Taro关闭页面时停止计时器

    1.在data中定义Loadingtime:'' constructor () {super(...arguments)this.state = {djsTime:3, // 倒计时时间Loading ...

  7. vue关闭页面时停止计数器

    vue启动停止setInterval data () {return {clearTimeSet:null,} }, mounted () {// 启动this.clearTimeSet = setI ...

  8. 一个按键精灵后台发送消息的脚本

    以前,我也用过按键精灵写过一些脚本,那时候经常用这个来挂机FB什么的. 那天,某网友问起,于是就回答了下 无非就是,抓句柄,然后相对定位坐标或者发送消息到固定窗体 代码如下: 1 //抓窗口句柄// ...

  9. easyui弹出窗关闭前调用确认窗口,先关闭页面后调用弹出窗口

    弹出窗关闭的时候提示是否关闭,同时进行一些对应的方法调用, 然而在进行页面关闭调用的时候,往往页面关闭了,才弹出确认对话框, $.messager.confirm和panel的onBeforeClos ...

最新文章

  1. 真香,写代码神器!32寸曲面显示器免费送
  2. Python 多进程异常处理的方法,你会吗
  3. python中取整数的几种方法
  4. Javascript 学习笔记 2: 标识语句
  5. 查看linux机器性能,Unix Linux 查看机器性能
  6. Shiro身份认证---转
  7. 源代码提交SOP(Git版)
  8. 配送交付时间轻量级预估实践
  9. 一本程序员职场的百科全书
  10. 组合逻辑电路的分析与设计
  11. 关于三段式状态机第三段是组合逻辑还是时序逻辑的问题?
  12. 3个方法解决百度网盘限速问题
  13. post 请求报400错误
  14. java defunct_神奇的僵尸进程问题
  15. 揭秘中国网络虚假新闻“制造器”,看传播者如何操纵操纵大众舆论?
  16. 谈谈privoxy:关于广告过滤和自动代理切换
  17. 一些数据采集卡使用过程中常见问题
  18. gpio控制和相关操作
  19. oracle查询挂起,表挂起更新查询Oracle 11g(Table hangs on Update query Oracle 11g)
  20. Restful风格的URL请求

热门文章

  1. 使用pandas循环数据帧的最有效方法是什么? [重复]
  2. springBoot跨域注解@CrossOrigin
  3. python编写命令行框架_使用 Python 和 Click 编写命令行应用程序
  4. 力扣——字符串转换整数 (atoi)
  5. JavaScript中的数字型
  6. 数据类型(简单数据类型、简单数据类型传参、复杂数据类型传参)
  7. 定位会完全压住标准流盒子里面的内容(HTML、CSS)
  8. 实验2-1-1 计算摄氏温度 (5 分)
  9. C#写文本写Csv文件操作
  10. ZPL指令打印 斑马打印机指令打印