PC浏览器返回相当于重新进入之前的页面,会触发刷新动作,而微信不会。也就是困扰我很久的微信返回不刷新。大概是2017年初,2016年底(大概是从那个时候开始做微信公众号),也可以在sessionStorage中记录刷新标志,这样就可以根据标志刷新上一页了。也就是说当时微信的返回还是会触发渲染事件(具体是什么事件不清楚,因为当时没深究,但是确实触发了componentDidMount)。但是从某个时刻开始,这个方法就不再有效了,说明需要通过存储记录来刷新flag是完全无效的。另外可以发现,之前的页面会保持上次操作的状态,不会再请求静态资源,也不会触发load事件。那也可以这样理解,微信中的页面跳转其实更类似于在浏览器中打开一个新的标签页。所以上一页的内容并没有售出,而是会保持跳转前的状态。所以我们的很多页面都会点击返回但是加载还在转。尝试一:visibilitychange由此,我想到了第一种检查他是否返回的方法——监听页面的visibilitychange事件。因为在PC浏览器中,如果切换tab或者浏览器缩略图,当它的可见性改变时,就会触发这个事件。有兴趣的可以打开控制台输入下面的代码看看区别。window.addEventListener('visibilitychange',function(){console.log(document.hidden)});无论如何,我首先尝试了以下代码:letisPageBack=false;window.addEventListener('visibilitychange',function(){if(document.hiden){isPageBack=true}elseif(isPageBack){fetch('/data')//因为visibilitychange事件中的alert可以看出是被模拟器ban掉了,所以自己改了fetch的接口,通过查看日志查看是否被触发}});尝试后发现事件并没有被触发。带着疑惑,试了下chrome手机浏览器,发现没有触发事件。另外,因为好奇app被推送到后台会不会触发事件,所以试了一下这段代码↓,发现即使后台页面被按下,也不会暂停。setInterval(function(){varp=document.createElement('p');p.appendChild(document.createTextNode(`${Date.now()}`));document.body.appendChild(p);},1000)尝试2:pageshow&pagehide和visibilitychange类似的还有pageshow和pagehide事件。pageshow事件的触发点是正在遍历的会话历史条目。同时根据MDN的介绍,back/forward时也会触发,所以我改了代码letisPageBack=false;window.addEventListener('pageshow',function(){if(isPageBack)fetch('/data')})window.addEventListener('pagehide',function(){isPageBack=true})意外有效,,,可以监听pageshow和pagehide事件。返回页面可以通过页面是否隐藏来知道是否返回。尝试三:historyhistory可以修改history或者url主要是history.pushState和history.replaceState。使用pushState相当于多推了一条历史记录,replaceState相当于修改了历史记录。另外,我们要知道reload是不包含在历史记录中的。理论上,如果使用pushState修改url,那么页面访问会是这样A->A1->B当B返回到A1时,会触发popstate事件。您可以在popstate事件中做一些自定义的事情。这里使用代码varstate={date:Date.now()};window.history.pushState(state,'csb');window.addEventListener('popstate',function(event){if(event.state)location.reload()})查看历史可以看到state中有一个key是日期的时间戳,并且历史记录的长度为+1。但是使用pushState会增加history,会导致同一个页面在退出前多次返回,不过可以用它来返回退出公众号window.history.pushState({},'csb');window.addEventListener('popstate',function(event){if(event.state){wx.ready(function(){wx.closeWindow();});}});但是因为replaceState不会增加历史,所以用它来返回这样刷新页面history.replaceState(null,null,'#');window.addEventListener('popstate',function(event){self.location.reload();})另外,如果A->B->C,当C返回时,如果想直接返回A,可以做这个B页面:history.replaceState(null,null,'/c');//将url替换为C,这样跳转到C页面就相当于转化为重新加载行为。但是直观来说,我们删除了一条历史记录
