当前位置: 首页 > Web前端 > JavaScript

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

时间:2023-03-27 16:46:02 JavaScript

需求这两天遇到一个需求:当用户刷新或关闭页面时,前端要向后台发送请求,释放页面的授权占用。分析了一下,这不就是在页面卸载的时候发送了一个请求吗?三遍五遍二分会实现一个版本:window.addEventListener("beforeunload",()=>{letoReq=newXMLHttpRequest();oReq.open("POST","http://127.0.0.1:1991/loginout");oReq.send(JSON.stringify({name:"ProgrammingSamadhi"}));测试发现在页面刷新的时候基本满足要求(偶尔会出现后台不亮的现象收不到请求,但概率很低)当页面关闭后,后台收不到请求,由于异步ajax不行,试试同步的,结果直接报错:搜索,解释如下所示:Chrome现在在页面离开或被用户关闭时不允许在页面关闭期间同步XHR。这涉及以下事件(在页面关闭路径上触发时):beforeunload、unload、pagehide和visibilitychange总结:对于目前的Chrome,当页面导航离开es或被用户关闭,则不允许发送同步XHR请求。涉及的事件有:beforeunload、unload、pagehide和visibilitychange。虽然问题没有解决,但是也增长了见识。浪还不错!Navigator.sendBeacon()搜索了一下,看到有一个接口是专门做这个的,就是navigator.sendBeacon()。说明该方法主要用于满足统计和诊断代码的需要,这些代码通常会在卸载文档之前尝试向web服务器发送数据。语法navigator.sendBeacon(url,data);参数url表示数据将发送到的网络地址。data参数是要发送的ArrayBufferView或Blob类型的数据,DOMString或FormData。返回值sendBeacon()方法将在用户代理成功将数据排队传输时返回true,否则返回false。实现既然有了接口,那么实现起来就很容易了。代码window.addEventListener("beforeunload",(e)=>{constdata={name:"ProgrammingSamadhi"};window.navigator.sendBeacon("http://127.0.0.1:1991/loginout",JSON.stringify(data));});效果无论是刷新页面还是关闭页面,后台都能收到前端发送的请求,完美实现了需求。综上所述,浏览器的功能越来越强大,支持的API也越来越丰富。以前很难实现的功能,现在可能是轻而易举的事,还是要多关注技术动向。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!你来,怀揣期待,我以墨香迎接你!您归来,不分得失,只送回味!知识与技能并重,内功与外功并重,理论与实践两手抓,两手都要用力!