最近在开发公司hybrid app的时候,需要将原本原生的配置中心模块统一变更为H5,做完之后从测试那里反馈回来这样一个问题,当滑到页面底部或中部的时候进入子页面进行设置,返回的时候页面应该定位到离开时候的位置,就是不要回到页面顶部,体验要接近原生。

提出的解决方案:在react生命周期的componentWillUnmount阶段获取当前滚动条的滚动距离,并且将这个数值存储在sessionStorage中,然后在componentWillMount阶段获取之前存储在sessionStorage中当前页面滑动条距离顶端的问题,然后开始采用window.scrollTo方法将当前页面滚动到之前页面停留的位置,即可实现需求。由于这个配置中心模块只有主页面是特别长的需要做这个操作,其他子页面都很短,因此不必考虑会对其他H5页面造成干扰。在chrome上调成手机模式自测没有问题,体验很好,遂上传代码,以为完美的解决了这个问题。然而,实践是检验真理的唯一标准,在打包构建放到stg环境上之后,用安卓手机自测发现报错:scrollTo is not a function,原来安卓的上元素不支持scrollTo的方法。

正确方案:后经反复试验,采用了一个更加周密、可靠的解决方案。首先在组件上监听一个滚动事件。即在componentWillMount阶段使用原生js监听滚动,

document.addEventListener('scroll', this.e.onScrollHandle, false);
constructor中也要注册一下这个方法:
this.e = {
onScrollHandle: this.onScrollHandle.bind(this)
};
具体的滚动事件,将其滚动位置实时记录下来
onScrollHandle(event) {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
localCache.setItem('_device_setting_scroll_' + PAGE_PARAMS.deviceId, scrollTop);
}
此处采用了localCache本地缓存作为存储容器,并且根据当前配置页面的deviceId作为标志位作了区分,防止记录上一台设备的设置页面的滚动位置而影响到下一台设备的设置页面的滚动位置。
在componentDidMount阶段取出记录的滚动条滚动位置,并开始滚动到指定位置,滚动到指定位置后移除记录的key,若用户又开始滚动,则又开始记录,若用户不再滚动,只是打开看一眼,则下次页面会置顶。
let cacheKey = '_device_setting_scroll_' + PAGE_PARAMS.deviceId;
localCache.getItem(cacheKey).then((scrollTop) => {
if(scrollTop){
document.body.scrollTop = document.documentElement.scrollTop = scrollTop || 0;
}
localCache.removeItem(cacheKey); });
最后,在componentWillUnmount阶段移除监听事件:
document.removeEventListener('scroll', this.e.onScrollHandle);
经测试,IOS和安卓手机都达到了预期效果,圆满修复了此bug。

hybrid App h5二级页面返回的时候保持与一级页面浏览的位置一致的更多相关文章

  1. 第三方网站返回hybrid app H5页面缓存问题应对策略

    最近负责公司各产品线购买模块的开发,各项功能如期开发完成后测试那边反馈回来一个问题:IOS手机在点击支付宝购买后,跳转到支付宝网站时不输入支付密码,直接点返回,返回到我们自己的APP购买界面发现页面显 ...

  2. 3分钟学会sessionStorage用法(h5页面返回滚动到上次浏览器位置)

    前言: 因最近移动端开发过程中遇到一个运营提出的所谓技术难点需求,对于原生APP来说轻而易举,毕竟自己的APP用户操作指哪打哪,但是H5该怎么做?H5就实现不了么?对于一个爱研究攻克这些前端棘手问题的 ...

  3. hybrid app、react-native 区别

    hybrid app.react-native 区别: 项目 hybrid app react-native 组件 用HTML.CSS.JavaScript实现页面的制作,然后运行在Webview上( ...

  4. html5手机返回按钮跳转到指定页面问题

    最近在做活动的时候有一个这样的场景,在主页面点击跳出一个弹层表单,填写完信息后,点击确认跳转到指定的展示页面了.这时候在手机端点击浏览器自带的返回按钮后,回到主页面,这时候主页面无法刷新,弹层信息还在 ...

  5. Hybrid APP之Native和H5页面交互原理

    Hybrid APP之Native和H5页面交互原理 Hybrid APP的关键是原生页面与H5页面直接的交互,如下图,痛过JSBridge,H5页面可以调用Native的api,Native也可调用 ...

  6. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  7. Hybrid App中原生页面 VS H5页面(分享)

    本文部分转自  http://www.jianshu.com/p/00ff5664e000 现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有“混合的” ...

  8. Hybrid App中原生页面 VS H5页面

    Hybrid App中原生页面 VS H5页面   现有3类主流APP,分别为:Web App.Hybrid App(混合模式移动应用,Hybrid有"混合的"意思). Nativ ...

  9. 移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处

    因为工作需要,需要进一步了解移动端的开发,遂返回复习移动端的知识点,在开始学习之前,产生了疑惑WEB APP .Native APP .Hybrid APP.React Native.Uniapp.H ...

随机推荐

  1. nio复习总结

    观察者: 多个对象依赖一个对象的状态, 当这个对象状态发生改变时,依次通知多个对象. 消息的分发和处理 事件驱动 / IO多路复用 借助select  epoll等 reactor: io事件触发时, ...

  2. Hex Dump In Many Programming Languages

    Hex Dump In Many Programming Languages See also: ArraySumInManyProgrammingLanguages, CounterInManyPr ...

  3. Introduction to MWB Minor Mode

    Introduction to MWB Minor Mode */--> Table of Contents 1. Introduction 2. Usage 1 Introduction MW ...

  4. PowerMock+SpringMVC整合并测试Controller层方法

    PowerMock扩展自Mockito,实现了Mockito不支持的模拟形式的单元测试.PowerMock实现了对静态方法.构造函数.私有方法以及final方法的模拟支持,对静态初始化过程的移除等强大 ...

  5. UVA 10559 Blocks(区间DP&&递推)

    题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...

  6. 【LOJ】#2205. 「HNOI2014」画框

    题解 我原来根本不会KM 更新每个节点增加的最小值的时候,要忽略那个方访问过的右节点!!! 然后就和最小乘积生成树一样了 代码 #include <iostream> #include & ...

  7. USACO 6.4 Electric Fences

    Electric FencesKolstad & Schrijvers Farmer John has decided to construct electric fences. He has ...

  8. Looksery Cup 2015 F - Yura and Developers 单调栈+启发式合并

    F - Yura and Developers 第一次知道单调栈搞出来的区间也能启发式合并... 你把它想想成一个树的形式, 可以发现确实可以启发式合并. #include<bits/stdc+ ...

  9. gitlab-针对API,获取私有令牌

    Gitlab有一个强大的API系统,几乎所有的功能都可以在web中执行,当然也可以通过API来执行,为了使用API,需要从Gitlab中获取私有token. 执行步骤: 1. 登陆Gitlab服务器 ...

  10. WCF服务发布到IIS中去(VS2013+win7系统)

    第一个WCF程序 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc ...