H5端,如何去兼容所有浏览器的退出返回事件

2,767 阅读3分钟

首先请原谅我折腾了很久,所以才要记下来。

首先记录一下这个问题的发生场景,因为我司是在做直播功能类型相关项目,在开发H5的过程中,有一个需求是,在页面退出的时候(发送一个异步请求),对页面进行一些操作。

在看到这个需求的时候,心想只需要监听页面关闭的时候去做一个退出的操作就OK,如此之简单,其实不然,在开发H5的时候调试各个浏览器的时候发现没有这么简单,而且安卓和IOS也有区别之分,有的浏览器会触发,有的不会触发,有的进到了监听的方法里面,但是没有去执行异步的操作,当时查阅了很多资料

先解释一下为什么会发生这种情况:

··这种情况只会发生在Ios或腾讯内置浏览器的内置返回和关闭上

  1. 先发一下解决方案
window.addEventListener('pagehide',()=>{
console.log('页面关闭了')
    $.ajaxSettings.async = false; //同步请求,防止页面还没执行post请求就关闭页面了
    $.post("url",{},function(data){
    },'json')
  }, false)

可能大家都直达这种解决方案,把异步请求改成同步,这样可以解决一部分问题,但是,在IOS中,微信内置浏览器中,这个ajax请求并不能有效的请求,原因是因为在ios手机上,关闭的页面进程杀的是很快,接口根本来不及响应就会中断掉,所以会出现无效请求,所以有了已下的方法来做请求操作

navigator.sendBeacon(urrl, formData)

第一个参数是请求的地址,第二个参数是要携带的参数,POST请求,参数为formData格式

window.addEventListener('onunload',()=>{
    navigator.sendBeacon(urrl, formData)
}, false)

这样就可以有效的去发送请求

在查资料的同时 有一个我认为的盲点,很多人说,ios的手机监听不到onunload事件,但是在测试过程中我发现是可以的,如果大家有监听不到的情况,可以用pagehide这个事件来代理

  1. 在安卓和ios手机上的自带浏览器中,我们在点击浏览器自带返回的时候,并不能去有效的监听页面返回和关闭,也不会去有效的进入监听的事件中,这个时候就出现了visibilitychange这个事件主要去监听页面的显示与否。我们可以在点击浏览器返回的时候去监听它做出相应的操作
document.addEventListener('visibilitychange', (e)=>{
  if (document.visibilityState === 'hidden') {
    console.log('页面隐藏了')
  } else if (document.visibilityState === 'visible') {
    console.log('页面显示了')
  }
},false)

3.上面说的方案,并不能很有效的去支撑我项目中的需求,因为,ios手机中关闭浏览器的情况有很多,比如说:按home退到前台,手指上滑放到中台等操作,这些操作,不管用哪些事件都是无法去监听的

所以如果大家有需求要进行这样的操作的话,就不要考考虑在客户端去解决这个问题,现在你只有俩种选择,1.换方案,从业务去规避 2.在服务器上做这个事情。

当然从业务上规避产品那边也不会让去这么做,所以就只能在服务端上去做这个事情,也就是,用心跳检查的方法去完成这个需求

每隔几分钟后端返回一个消息,我在收到消息的同时给后端一个信号,也就相当于长链接,当然,性能肯定是有损耗的,这是避免不了的

以上都是自己的一些见解以及实操经验,有任何错误及好的解决办法可留言评论!! 变成路上的小蚂蚁