评论

关于 Android 上 web-view 无法调用history.back 解决方案

解决 Android web-view history.back 无效问题

最近在开发小程序,部分业务使用到 h5(技术栈:Vue+Vue-Router,hash 模式),从小程序A页面,跳转到 H5 的B页面,B 再跳转到 C,在 C 页面使用 history.back 或 router.back 无法返回 B页面,点击 Navbar 的返回,直接返回到 A 页面问题。发现好多同学也遇到了此类问题:https://developers.weixin.qq.com/community/develop/doc/000086ff4b81188a8c1b782695b400?_at=1641620051949

https://developers.weixin.qq.com/community/develop/doc/00020e3dfb8178c61d3d3243251000?highLine=web-view

通过在 h5 上打印 history.length 日志,发现了无法返回的原因,在打开两个页面时,history.length 大于2时,无法正常返回,经过分析,发现这样写小程序web-view组件时,必然会出现无法返回:


Page {
  data: {
    url: null,
  },
  onLoad(options){
    const {url} = options;
    setTimeout(() => {
         //do something
         this.url = url;
     },duration)  ;       
   },
 }
        

如果按以上的写法,恭喜你,中招了,这样打开 h5后,history.back 或 router.back 会无效。原因是 url 为空时,web-view 加载了一次,当获取真实的url时,又加载了一遍,这必然导致了 history 栈的错乱,导致了 web-view 处理 history.back 或 router.back 无效。web-view 到底如何处理 back ,这个核心逻辑就无从得知了。

解决方案:

这样即可,保证了web-view只加载一次。 onLoad 没有延时获取 url,会不会出现该问题,暂时没有去研究。但建议还是做个 if 判断,拿到 url 后,在去渲染 web-view 就没大错。

最后一次编辑于  2022-01-13  
点赞 0
收藏
评论

4 个评论

  • 一
    2023-08-10

    ?????????????????????????????

    2023-08-10
    赞同
    回复
  • 一瓶水想风
    一瓶水想风
    2022-08-16


    请问解决方案这边写的是什么?

    2022-08-16
    赞同
    回复
  • YyJjHh
    YyJjHh
    2022-04-13

    我这里还是不行诶,加了v-if去判断都不行

    2022-04-13
    赞同
    回复
  • 卡西卡🐢
    卡西卡🐢
    2022-01-26

    完美解决,nice

    2022-01-26
    赞同
    回复
登录 后发表内容