首先请原谅我折腾了很久,所以才要记下来。
首先记录一下这个问题的发生场景,因为我司是在做直播功能类型相关项目,在开发H5的过程中,有一个需求是,在页面退出的时候(发送一个异步请求),对页面进行一些操作。
在看到这个需求的时候,心想只需要监听页面关闭的时候去做一个退出的操作就OK,如此之简单,其实不然,在开发H5的时候调试各个浏览器的时候发现没有这么简单,而且安卓和IOS也有区别之分,有的浏览器会触发,有的不会触发,有的进到了监听的方法里面,但是没有去执行异步的操作,当时查阅了很多资料
先解释一下为什么会发生这种情况:
··这种情况只会发生在Ios或腾讯内置浏览器的内置返回和关闭上
- 先发一下解决方案
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这个事件来代理
- 在安卓和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.在服务器上做这个事情。
当然从业务上规避产品那边也不会让去这么做,所以就只能在服务端上去做这个事情,也就是,用心跳检查的方法去完成这个需求
每隔几分钟后端返回一个消息,我在收到消息的同时给后端一个信号,也就相当于长链接,当然,性能肯定是有损耗的,这是避免不了的
以上都是自己的一些见解以及实操经验,有任何错误及好的解决办法可留言评论!! 变成路上的小蚂蚁