vue页面回退或关闭, 发送请求不中断

14 篇文章 1 订阅
5 篇文章 0 订阅

最近做项目有个需求: video 播放视频中,点击浏览器回退按钮调用接口统计观看时长。

就是这个看似简单的事,折腾我两天,最后终于搞定。

首先 vue 在回退或关闭页面之前调用某个方法

mounted() {
  window.addEventListener('beforeunload', e => this.pause(e))
},
destroyed() {
  window.removeEventListener('beforeunload', e => this.pause(e))
}
  • mounted 组件挂载生命周期 让 window 监听 beforeunload 事件,并给对应方法。
  • destroyed 销毁生命周期 让 window 去除监听 beforeunload 事件。

pause 方法中,要调用接口统计视频观看时长。

这时候问题出现了!

在浏览器回退(或关闭)后,axios 调用接口时被中断,没调用成功。搜索问题发现需要同步调用接口。后来用 async await 调用 axios 。 甚至用原生 XMLHttpRequest 对象同步调用接口,均以失败告终。

原来 Chrome 浏览器不允许页面关闭期间进行同步调用XMLHTTPRequest() 方法,这条规则适用于 beforeunloadunloadpagehidevisibilitychange 这些 API

为了保证页面在卸载时可以成功调用接口请求数据,官方建议使用 sendBeacon() 或者 Fetch keep-alive

Fetch keep-alive 为例:

pause() {
  let url = process.env.VUE_APP_BASE_URL + '/api/setData';
  let data = {
    ...params // 一些参数
  }

  // fetch 调用接口
  fetch( url, {
    method: 'POST',
    headers:{
      'Accept': 'application/json',
      'Content-Type': 'application/x-www-form-urlencoded',
      'Authorization': 'Bearer ' + getToken() // getToken 返回 token
    },
    body: qs.stringify(data),
    keepalive: true
  });
}
  • fetch 方法不需要安装依赖,vue 中直接使用
  • keepalive 设置为 true 就可确保浏览器关闭或回退,调用接口的链接不会被关闭,调用成功。
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值