H5页面中的返回实现


声明:本文转载自https://my.oschina.net/zqzjszqzjs/blog/1621223,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

看到这个题目你可能觉得这是什么鬼? 其实我想说的是这种,看下面的录制:

opp5

这种交互在H5页面中比比皆是,点击城市->弹出城市选择浮层->按返回按钮关闭浮层

这些操作都是不要点击左上角/右上角的关闭按钮就可以进行的,飞猪的H5是前进出现弹层,返回时弹层关闭,其他家都不行(去哪儿网H5飞机票,美团H5酒店)。

为什么要这么设计?

因为H5是在手机上操作的,手机上的手指可操作区域的覆盖范围很小,更别说左上角/右上角这些死角(取消/关闭)区域了。你肯定听过这个操作:轻触返回。这个在用户操作的时候非常方便友好,选择完城市后,不需要点击取消,直接在大拇指可以操作的地方点击返回就关闭了弹层。

如何实现

既然有这种非常好的需求,那作为开发肯定就会想法设法的实现这个功能了。 你甚至都不用google,你就应该会想到类似的history.back(),history.go()这些方法了。 然而想到这些依旧没用,理论上 浏览器/webview 的返回/前进的是要重新加载页面的,因为URL发生了变化。 如果你真的知道单页面应用(SPA),或者使用React/Vue你就应该知道有个东西叫:路由。 这些通过改变hash且无法刷新的url变化是HTML5时加入的history功能

the-history-interface

interface History {   readonly attribute unsigned long length;   attribute ScrollRestoration scrollRestoration;   readonly attribute any state;   void go(optional long delta = 0);   void back();   void forward();   void pushState(any data, DOMString title, optional DOMString? url = null);   void replaceState(any data, DOMString title, optional DOMString? url = null); }; 
  • pushState
  • replaceState

还有一个事件

  • onpopstate

pushState,replaceState 用来改变histroy堆栈顺序,onpopstate 在返回,前进的时候触发

vue-router中的实现也是如此(第1694行)

具体实现

既然说了这么多,那我们来看下怎么实现这种功能。

来看下 pushState 和 replaceState 的兼容性

image

全绿,用起来放心多了。

思路:

  • 点击弹层时 pushState 添加 hash
  • "轻触返回"的时候触发 onpopstate 事件时候隐藏弹层并修改 hash
<button onclick="city()">         城市     </button><br>     <button onclick="calendar()">         日历     </button><br>     <button onclick="description()">         说明     </button>      <div id="city" class="com" style="display: none;">       模拟城市弹框层     </div>     <div id="calendar" class="com" style="display: none;">       模拟日历弹框层     </div>      <div id="description" class="com" style="display: none;">       模拟说明弹框层     </div> 
      button {           border: #0000;           background-color: #f90;       }       .com {         position: absolute ;         top: 0;         bottom: 0;         left: 0;         right: 0;         background-color: #888589;       } 
var cityNode = document.getElementById('city');     var calendarNode = document.getElementById('calendar');     var descriptionNode = document.getElementById('description');       function city() {         cityNode.style.display = 'block';         window.history.pushState({'id':'city'},'','#city')       }       function calendar() {         calendarNode.style.display = 'block';         window.history.pushState({'id':'calendar'},'','#calendar')       }       function description() {         descriptionNode.style.display = 'block';         window.history.pushState({'id':'description'},'','#description')       }       window.addEventListener('popstate', function(e){         // alert('state:' + e.state + ', historyLength:' + history.length);         if (e.state && e.state.id === 'city') {             history.replaceState('','','#');             cityNode.style.display = 'block';         } else if (e.state && e.state.id === 'calendar') {             history.replaceState('','','#');             calendarNode.style.display = 'block';         } else if (e.state && e.state.id === 'description') {             history.replaceState('','','#');             descriptionNode.style.display = 'block';         } else {             cityNode.style.display = 'none';             calendarNode.style.display = 'none';             descriptionNode.style.display = 'none';         }       }) 

主要看 JS 代码,监听页面的前进和后退事件来控制history。

opp6

也可以扫码下面二维码在手机上查看

输入图片说明

源码

本文发表于2018年02月11日 18:36
(c)注:本文转载自https://my.oschina.net/zqzjszqzjs/blog/1621223,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1985 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1