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 相关文章推荐
使用JS+CSS3技术:让你的名字动起来
Apr 27 HTML / CSS
css3实例教程 一款纯css3实现的环形导航菜单
Oct 20 HTML / CSS
详解CSS3中border-image的使用
Jul 18 HTML / CSS
用React加CSS3实现微信拆红包动画效果
Mar 13 HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
Sep 28 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
Feb 24 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
Mar 25 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
Oct 23 HTML / CSS
HTML5的结构和语义(1):前言
Oct 17 HTML / CSS
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
Nov 07 HTML / CSS
Html5元素及基本语法详解
Aug 02 HTML / CSS
教你使用Canvas处理图片的方法
Nov 28 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
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
JavaScript 学习笔记(五)
2009/12/31 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
Django的models模型的具体使用
2019/07/15 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
Python如何急速下载第三方库详解
2020/11/02 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
电子专业毕业生自我鉴定
2014/01/22 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS