现象

在微信浏览器中,有两种情况容易引发异常:

1、微信浏览器中某一个元素处于全屏时,这时微信出现弹窗;

2、微信浏览器某一个元素处于全屏时,切换到其他应用,微信后台运行
  一段时间再切回来;

这时我们的页面将处于一个异常状态,既非全屏也非退出全屏状态,页面的退出全屏操作将失效,无法使网页恢复到初始状态,除非刷新微信浏览器,严重影响用户体验。

注意:笔者所说的两种现象均是在iframe嵌套的内部网页中出现,猜测在非iframe的情况下也会引发,但尚未核实,如有误,欢迎指出。

难点探究

这两种情况都有一个共同的特点:

1、异常状态使得我们的全屏逻辑完全不起作用。

2、这种状态是由于微信的机制导致,而微信没有提供相关api供我们调用。
因此我们基于浏览器的操作是完全不起作用的。

笔者在探究的基础上总结了一些结论,可供参考,现分享如下。

解决思路

  • 1.避免在全屏时引发弹窗,如果业务逻辑不可改,那么就先退出全屏再触发弹窗。
    一个明显的例子是,假如我们在某个元素全屏的状况下,查询设备是否支持摄像头,将导致微信询问是否允许开启摄像头,这时引发页面异常。可采用的解决方案是:先退出全屏,而后查询设备是否支持摄像头。
  • 2.在全屏时切换到微信之外的其他应用引发的页面异常问题,可采用H5的visibilitychange事件使页面重新加载来解决。
    visibilitychange事件的作用是,在浏览器标签页被隐藏或显示的时候触发。经核实,在切换微信浏览器时也会触发该事件。
document.addEventListener("visibilitychange", 
	function() {
	  const state = document.visibilityState;
	  if(state === 'visible'){
	  	window.location.reload();
	  }
});