首页 > 其他分享 >页面卸载前(用户关闭页面)向服务器发送请求

页面卸载前(用户关闭页面)向服务器发送请求

时间:2022-11-20 16:45:19浏览次数:76  
标签:浏览器 用户 关闭 卸载 服务器发送 data fetch 页面

废话不说,直接进正题。

最近项目有个需求需要在用户关闭页面时将页面存留的统计数据发送到后端。该需求有两个关键点:

  • 监听页面卸载
  • 在卸载时发送数据

如何监听用户关闭页面

首先我们需要明确,哪些场景属于用户关闭页面:

  • 关闭浏览器
  • 关闭/刷新页面

可监听上述场景的API为:

  • unload
  • beforeunload
  • pagehide
  • visibilitychange

但在许多情况下(尤其是移动设备)浏览器不会产生 unload、beforeunload 或 pagehide 事件。下面列出了一种不触发上述事件的情况:

  1. 用户加载了网页并与其交互。
  2. 完成浏览后,用户切换到了其它应用程序,而不是关闭选项卡。
  3. 随后,用户通过手机的应用管理器关闭了浏览器应用。

故此,我们采用visibilitychange + pagehide的组合方式监听用户行为。

if((typeof document.onvisibilitychange) !== 'undefined') {
	document.addEventListener('visibilitychange', function logData() {
	  if (document.visibilityState === 'hidden') {
	    // ... 发送数据
	  }
});
}else if((typeof window.onpagehide) !== 'undefined') {
	window.addEventListener("pagehide", event => {
	  if (event.persisted) {
	    /* the page isn't being discarded, so it can be reused later */
	  }
	}, false);
}

如何在卸载时发送数据

方法一: window.navigator.sendBeacon

语法

navigator.sendBeacon(url, data);

参数

  • url:表明 data 将要被发送到的网络地址。

  • data(可选): 将要发送的 ArrayBuffer、ArrayBufferView、Blob、DOMString、FormData 或 URLSearchParams 类型的数据。

返回值:当成功将数据加入传输队列返回true,否则返回false

示例

const blob = new Blob([JSON.stringify(data)], { type: 'application/json; charset=UTF-8'});
window.sendBeacon(url, blob);

其他

  • 数据限制:在大多浏览器上最多只能发送64kb的数据(亲测Chrome及Safari浏览器上最多发送64kb)。
  • 请求方法:通过POST请求发送数据。
  • 请求头: 通过传入数据data自动设置请求头,一般的: FormData: multipart/form-data,DomString: text/plain ,想传递json数据到后端,可以通过Blob对象间接达到设置Content-type的效果。

浏览器兼容

方法二: fetch设置keepalive为true

语法

Promise fetch(input[, init]);

参数详见:fetch()-MDN

示例

fetch(url, { 
	body: data, 
	mode: 'no-cors', 
	method: 'POST', 
	headers: { 'Content-Type': 'application/json'}
}).then(response => response.json())
  .then(data => console.log(data));

其他

  • 数据限制:设置keepalive为true,最多只能发送64kb的数据(亲测Chrome及Safari浏览器上最多发送64kb)。

浏览器兼容

参考

标签:浏览器,用户,关闭,卸载,服务器发送,data,fetch,页面
From: https://www.cnblogs.com/rainbowly/p/16908834.html

相关文章

  • 好看404页面
    1<!DOCTYPEHTML><html><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1"><metaname="robots"content="n......
  • vue 中 使用flexible+rem 实现页面元素 随窗口大小自适应w
      1.引入flexible.js   这个适用于ui图1920px  其他大小需对应调整flexible.js把屏幕分为24等份 把下面的代码复制到项目中  新建一个js文件(func......
  • vba解析html页面
    vba解析html页面Subtest() 'vba解析html页面(字符串)Dimohtml,ohttp,table,byid,byname,byclassname,selectorall,selectorAsObject,sAsString......
  • <原文转载> 自定义博客园博客页面鼠标
    1、鼠标指针替换在博客设置->文件中上传自己的鼠标样式,上传时注意将后缀改为.ico对刚刚上传的ico文件右键->复制链接地址添加css代码在博客设置->设置中找到页面......
  • web页面漂浮广告
    <divid="kefuLayer"style="position:absolute;right:100px;top:100px;width:210px;height:275px;z-index:10000;border:1pxsolid#cdcdcd;white-......
  • layui提示框、动画、设置灰色页面
    使用layui提示框:在事件触发函数中:layer.msg(" ",{skin:"class:"类名" "}),定义的类名可以修改提示的样式,提示框还有一个最小宽度min-width,需要时可修改。css动画:在sty......
  • 页面置换算法:LRU和LFU
    目录页面置换算法简介LRU和LFU算法算法实现LRU算法题目:Leetcode.16.25思路代码实现LFU算法思路代码实现页面置换算法简介在地址映射过程中,若在页面中发现所要访问的页面......
  • CSS注册页面练习
    样式      展示      ......
  • HTML CSS 注册页面练习
    样式      展示      ......
  • Tomcat_安装&卸载&启动、启动问题分析
    Tomcat_安装&卸载&启动  Tomcat:web服务器软 1.下载:http://tomcat.apache.org/ 2.安装:解压压缩包即可。 注意:安装目录建议不要有中文和空......