uni-app h5 webview跳转后返回页面回到了顶部未记录滚动位置,h5安卓机复现

uni-app h5 webview跳转后返回页面回到了顶部未记录滚动位置,h5安卓机复现

开发环境 版本号 项目创建方式
Mac 13.2.1 (22D68) HBuilderX
HBuilderX 2.0.2

操作步骤:

h5 webview跳转后返回,页面回到了顶部,没有记录滚动位置,h5安卓机复现,ios正常。排查定位到是h5实现webview使用 iframe,使用display: none导致的

预期结果:

h5 webview 跳转后返回记录滚动位置

实际结果:

h5 webview跳转后返回,页面回到了顶部,没有记录滚动位置,安卓端

bug描述:

h5 webview跳转后返回,页面回到了顶部,没有记录滚动位置,h5安卓机复现,ios正常。排查定位到是h5实现webview使用 iframe,使用display: none导致的


更多关于uni-app h5 webview跳转后返回页面回到了顶部未记录滚动位置,h5安卓机复现的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

蹲蹲蹲蹲

更多关于uni-app h5 webview跳转后返回页面回到了顶部未记录滚动位置,h5安卓机复现的实战教程也可以访问 https://www.itying.com/category-93-b0.html


我测试了一下在安卓上的h5,并用www.baidu.com测试并未复现你的问题,是否能提供问题工程?

webview跳转到原应用(比如:h5),再从原应用返回到webview,这时候webview页面就在顶部,不是在原来的位置

h5项目使用webview好像就能复现了

回复 蔡cai: 能提供一个问题复现工程吗

回复 HRK_01: 等下,我去试下

回复 HRK_01: 测试服务器挂了,可能没那么快给你

回复 HRK_01: 试下是没有,到时候我找找问题

回复 蔡cai: 什么意思?现在该问题又不会复现了是吗

回复 HRK_01: 现在写的测试案例不会,等测试服务器好了,我去看看

回复 蔡cai: 好的,感谢你的反馈

uni-app 中,当你在 H5 页面中使用 webview 进行页面跳转后返回时,页面回到了顶部,且未记录滚动位置的问题,通常是由于浏览器的默认行为或 uni-app 的页面管理机制导致的。以下是一些可能的原因和解决方案:


1. 浏览器默认行为

浏览器的默认行为是在页面跳转后返回时不会自动记录滚动位置,尤其是对于动态加载的内容或单页应用(SPA)。

解决方案:

  • 手动记录滚动位置: 在页面跳转前,手动记录当前页面的滚动位置,并在返回时恢复滚动位置。

    // 在跳转前记录滚动位置
    let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    uni.setStorageSync('scrollTop', scrollTop);
    
    // 在返回时恢复滚动位置
    onShow() {
      let scrollTop = uni.getStorageSync('scrollTop');
      if (scrollTop) {
        document.documentElement.scrollTop = scrollTop;
        document.body.scrollTop = scrollTop;
      }
    }
    

2. uni-app 页面管理机制

uni-app 的页面管理机制可能会导致页面返回时重新渲染,从而丢失滚动位置。

解决方案:

  • 使用 keep-alive 缓存页面: 在 pages.json 中为页面配置 keep-alive,以缓存页面状态,包括滚动位置。

    {
      "path": "pages/yourPage/yourPage",
      "style": {
        "navigationBarTitleText": "Your Page",
        "enablePullDownRefresh": false,
        "app-plus": {
          "keepAlive": true
        }
      }
    }
    
  • 手动管理页面缓存: 在 onLoadonUnload 生命周期中手动管理页面缓存。

    onLoad() {
      if (this.$options.data().scrollTop) {
        document.documentElement.scrollTop = this.$options.data().scrollTop;
        document.body.scrollTop = this.$options.data().scrollTop;
      }
    },
    onUnload() {
      this.$options.data().scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    }
    

3. 安卓 WebView 的特定问题

安卓的 WebView 在某些情况下可能不会自动记录滚动位置,尤其是在动态加载内容或页面结构复杂的情况下。

解决方案:

  • 强制刷新滚动位置: 在页面返回时,强制刷新滚动位置。

    onShow() {
      setTimeout(() => {
        let scrollTop = uni.getStorageSync('scrollTop');
        if (scrollTop) {
          document.documentElement.scrollTop = scrollTop;
          document.body.scrollTop = scrollTop;
        }
      }, 100); // 延迟确保页面渲染完成
    }
    

4. uni-app 的 scroll-view 组件

如果页面使用了 scroll-view 组件,滚动位置的管理需要额外注意。

解决方案:

  • 记录 scroll-view 的滚动位置: 在跳转前记录 scroll-view 的滚动位置,并在返回时恢复。

    // 记录滚动位置
    let scrollTop = this.$refs.scrollView.scrollTop;
    uni.setStorageSync('scrollTop', scrollTop);
    
    // 恢复滚动位置
    onShow() {
      let scrollTop = uni.getStorageSync('scrollTop');
      if (scrollTop) {
        this.$refs.scrollView.scrollTop = scrollTop;
      }
    }
回到顶部