微信浏览器手势前进后退爬坑

556 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

缘起

相信开发过移动端的小伙伴肯定被手机原生提供的手势操作折磨过,那感觉真的是不要不要的。

话说事情是这样的,周一上班的早上测试同学急匆匆的跑到我的工位上,急吼吼的跟我喊着:“出bug了,移动端报了个线上bug”。

平地一声雷,惊得我直接蹦起来了。经过跟测试同学的一番拉扯之后,我才弄清了事情的原委。

原来,客户报上来说,通过手势前进、后退这样的操作,会导致用户的积分数量显示异常。

一探究竟

经过我通过查询日志、抓包调试一通操作之后,终于发现了问题所在:原来是通过手势后退的时候,没有触发任何的生命周期,之前在onDidShow钩子中写的重新拉取数据的逻辑也就没有执行了

猜测可能的原因:通过手势后退的时候,直接从缓存的历史栈中直接拿出页面来,所以不会触发相关的生命周期。

天真的我以为,既然问题已经找到了,那么解决还不是分分钟钟的事情。

艰难的爬坑之旅

初次爬坑

一番百度之后,我信心指数爆棚。

我在网上发现好多人都说可以通过popstate来监听页面是不是返回了,我就单纯的以为这个方法是很ok的。

具体代码如下:

    window.addEventListener('popstate', () => {
        console.log('页面后退了~');
    });

结果一番调试发现,毛都没触发,这个监听事件依然没有执行,并没有出现什么奇迹。

二次尝试

又是一番鸡飞狗跳的百度,最终发现有人描述了原因,还给出了解决方案。

image.png

    if (UserAgent.env.android) {
      try {
          window.tbs_bridge.nativeExec('network', 'type', 0, null);
      } catch (e) {
          console.error(e);
      }
    }

我再一次的相信了它,然后实际调试之后,发现依然没有卵用。

三探虎穴

迫于客户、产品多方的压力,我只能默默的打开百度继续探索。就在我将要放弃的时候我发现了这个api——pageshow。

当一条会话历史记录被执行的时候将会触发页面显示 (pageshow) 事件。(这包括了后退/前进按钮操作,同时也会在 onload 事件触发后初始化页面时触发)

经过一番测试发现,果然可以。但是新的问题出现了,pageshow触发的次数超出预期了,这个应该就是跟官方所说的onload事件触发之后初始化时也会触发。

该如何判断是手势操作呢,还是onload初始化呢?

一番搜索发现有大佬提供了方法:window.performance && window.performance.navigation.type == 2

不太对呀,vs code怎么提示我这个api废弃了,纳尼?

image.png

还好,我还有一手,performance.getEntriesByType("navigation")[0].type === 'back_forward'

经过一番调试,妥了。

结语

最终,通过在popshow监听事件中,通过判断back_forward来判断页面是后退了,然后通过调用api来获取最新数据了。

万幸,最终问题解决了,又可以开心的摸鱼了。

欢迎小伙伴在下方留言交流。