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
蹲蹲蹲蹲
更多关于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 } } } -
手动管理页面缓存: 在
onLoad和onUnload生命周期中手动管理页面缓存。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; } }

