埋点?数据统计?关闭浏览器前发送请求?看完这一篇搞定
发布于 3 年前 作者 daiguiying 4558 次浏览 来自 分享

点赞、收藏、评论,三连击,回家不迷路

故事是这样发生的,由于公司业务发展需要,产品需要对不同人访问做一个访问记录及访问时长,这个访问时长就很难了,从开始到结束这个过程,我们需要把时间上传服务器,如果正常埋点你会发现,还没发送完成就已经被中止了。<br>

于是我在百度上不停的查找方法,有时搜索手势不对,对收搜结果差别还是很大的,刚开始搜索我找到了一个叫onbeforeunload的事件,这是关闭浏览器前或者刷新浏览器会触发的事件,让我感觉希望的前线,具体如下:

onbeforeunload 事件属性


windowwindow.onbeforeunload=function(e){       

    var e = window.event||e;

    e.returnValue=("确定离开当前页面吗?");

}

等你搬到你代码里面你会发现,确实可以阻拦浏览器关闭或者刷新,但是出现弹框后所以js都不会执行了,请求也会停留,这。。。不符合我的需求啊。onbeforeunload详情解析<hr>

无奈,我只能继续开始寻找,寻找一个适合需求的方法,几经查找几个小时,发现一个新的方法它叫navigator.sendBeacon,刚开始我是一脸蒙逼的,内心不停的思索,这个玩意能满足我的需求?这么简单能发起请求?这东西怎么用,会不会很复杂?三连击连问。说实话能,解决三连问的问题

今日主角 navigator.sendBeacon(url, data)

`` url ``



`` url `` 参数表明 `` data `` 将要被发送到的网络地址。
`` data ``



`` data `` 参数是将要发送的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray" rel="noopener" target="_blank">`` ArrayBufferView ``</a> 或 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Blob" rel="noopener" target="_blank">`` Blob ``</a>, <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/DOMString" rel="noopener" target="_blank">`` DOMString ``</a> 或者 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/FormData" rel="noopener" target="_blank">`` FormData ``</a> 类型的数据。
<a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/sendBeacon" rel="noopener" target="_blank">MDN文档更多详情解析</a>
以下是几种格式传参方式:
// 1. DOMString类型,该请求会自动设置请求头的 Content-Type 为 text/plain
const reportData = (url, data) => {
  navigator.sendBeacon(url, data);
};

// 2. 如果用 Blob 发送数据,这时需要我们手动设置 Blob 的 MIME type,
// 一般设置为 application/x-www-form-urlencoded。
const reportData = (url, data) => {
  const blob = new Blob([JSON.stringify(data), {
    type: 'application/x-www-form-urlencoded',
  }]);
  navigator.sendBeacon(url, blob);
};

// 3. 发送的是Formdata类型,
// 此时该请求会自动设置请求头的 Content-Type 为 multipart/form-data。
var data = {
   name: '前端名狮子'  ,
   age: 20
};
const reportData = (url, data) => {
  const formData = new FormData();
  Object.keys(data).forEach((key) => {
    let value = data[key];
    if (typeof value !== 'string') {
      // formData只能append string 或 Blob
      value = JSON.stringify(value);
    }
    formData.append(key, value);
  });
  navigator.sendBeacon(url, formData);
};
// 监听网页关闭或刷新
window.addEventListener('unload', logData, false);
function logData() {
    navigator.sendBeacon("/log", analyticsData);
}
    1. 先讲解线上测试方法
    • 判断是否发送成功线上测试地址

    • 测试代码写法,如下:

    if ('sendBeacon' in navigator) {
      window.addEventListener('pagehide', function() {
        navigator.sendBeacon(
          'https://putsreq.herokuapp.com/4GE2nVUuDoDGsNyKES2G',
          'Sent by a beacon!2');
      }, false);
    }
    
    • 测试结果查看方法如下(可以结合图片):
      1. 可以查看Requests次数。
      2. 测试前,可以清空记录clear history
      3. 查看发送请求头及内容Headers
    1. 可以利用浏览器自带保留请求接口或控制台输出的方法,刷新查看是否发送请求(这里需要注意几点)
    • 1.接口查看需要先点击preserve log,然后点击All,在网络捉取才会出现,因为navigator.sendBeacon发送的请求类型不属于平时请求的XHR类型。
    • 2.控制台查看需要先点击preserve log,然后刷新就不会把之前输出的全部清空。
    • 3.可以结合下面的图片进行操作,很方便。最后上传完可以叫后端查看数据是否提交成功了。


浏览器兼容性

本人掘金号

喜欢记得点个赞,谢谢

1 回复

江南互娱圈外平台,斗丶牛金丶花三丶公跑丶得快丶等多种热门玩法! 

app软件,体力模式,无需押斤,不要房卡,随时可以结算,没有限制,平台确保纯真人玩家在线竞技,千人俱乐部,24小时不熄火,绿色禁挂可T平台,资金有保证,欢迎各位老板在线取款。 

+嶶13809836720或aa1537957

财神联盟以诚立名,信行天下,务实创新,不断提高服务质量。立志做全网最火爆集团软件,秒到秒回,极速下款无套路。十年信誉老品牌,时间的沉淀见证品牌可靠,为您的安全盈利,一路护航。

回到顶部