Html5页面中的返回实现的方法


Posted in HTML / CSS onFebruary 26, 2018

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

Html5页面中的返回实现的方法

这种交互在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);
};
  1. pushState
  2. replaceState

还有一个事件

  1. onpopstate

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

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

具体实现

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

来看下 pushState 和 replaceState 的兼容性

Html5页面中的返回实现的方法

全绿,用起来放心多了。

思路:

  1. 点击弹层时 pushState 添加 hash
  2. "轻触返回"的时候触发 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。

Html5页面中的返回实现的方法

源码在此

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
css3闪亮进度条效果实现思路及代码
Apr 17 HTML / CSS
CSS3,线性渐变(linear-gradient)的使用总结
Jan 09 HTML / CSS
animation和transition的区别
Oct 12 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
Mar 05 HTML / CSS
详解HTML5中download属性的应用
Aug 06 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
Sep 02 HTML / CSS
五个2015 年最佳HTML5 框架
Nov 11 HTML / CSS
HTML5实现桌面通知 提示功能
Oct 11 HTML / CSS
详解基于canvas的视频遮罩插件
Jan 04 HTML / CSS
萌新的HTML5 入门指南
Nov 06 HTML / CSS
html实现弹窗的实例
Jun 09 HTML / CSS
CSS实现单选折叠菜单功能
Nov 01 HTML / CSS
简述Html5 IphoneX 适配方法
Feb 08 #HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
Feb 05 #HTML / CSS
canvas绘制视频封面的方法
Feb 05 #HTML / CSS
HTML5新特性之type=file文件上传功能
Feb 02 #HTML / CSS
HTML5 canvas 瀑布流文字效果的示例代码
Jan 31 #HTML / CSS
HTML5 WebSocket实现点对点聊天的示例代码
Jan 31 #HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
Jan 30 #HTML / CSS
You might like
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
使用Python函数进行模块化的实现
2019/11/15 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
应聘护士自荐信
2013/10/21 职场文书
政府法律服务方案
2014/06/14 职场文书
民政局个人整改措施
2014/09/24 职场文书
商品陈列协议书
2014/09/29 职场文书
2015大学生实训报告
2014/11/05 职场文书
武侯祠导游词
2015/02/04 职场文书
劳资员岗位职责
2015/02/13 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
股东协议书范本2016
2016/03/21 职场文书