【场景:用户离开前页面打点,发送的请求出现pending情况】
监听页面离开事件
window.addEventListener('unload', logData, false); // visibilitychange(首选,有各种兼容写法), unload, beforeunload, pagehide
打点一般使用XMLHttpRequest对象发送数据,而XMLHttpRequest对象是异步发送,可能在它即将发送的时候,页面已经卸载,从而导致发送取消或者失败
AJAX 通信改成同步发送(只有发送完成,页面才能卸载)。但是目前很多浏览器已经不支持同步的XMLHttpRequest对象了
新建一个<img>
元素,数据放在src属性,作为 URL 的查询字符串,这时浏览器会等待图片加载完成(服务器回应),再进行卸载。
创建一个循环,规定执行时间为几秒钟,在这几秒钟内把数据发出去,然后再卸载页面。
Navigator.sendBeacon()
方法(推荐使用),是浏览器为解决前三个方法都会拖长页面卸载时间的问题(导致后面页面的加载被推迟)而引入的。该方法仍然是发送异步请求,但是请求与当前脱钩,是作为浏览器的任务而存在,因此可以保证会把数据发出去,不拖延卸载流程。
window.addEventListener('unload', logData, false);
function logData() {
navigator.sendBeacon(url, data);// 第一个参数是目标服务器的URL 第二个参数可选
// 其返回值是一个布尔值,成功发送数据为true,否则为false;
// 发送数据的 HTTP 方法是 POST,可以跨域