javascript-hashchange事件和历史状态管理实例分析


Posted in Javascript onApril 18, 2020

本文实例讲述了javascript-hashchange事件和历史状态管理。分享给大家供大家参考,具体如下:

hashchange事件

hashchange事件,可以监听URL参数(#后面的字符串)什么时候发生变化。

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="EventUtil.js"></script>
  <script>
    EventUtil.addHandler(window, 'load', function () {
      var form = document.forms[0]
      var elements = form.elements
      var mybutton = elements['createBtn']
      var div = document.getElementById('uuid')
      var data = {}
      EventUtil.addHandler(mybutton, 'click', function (event) {
        event = EventUtil.getEvent(event)
        var target = EventUtil.getTarget(event)
        var uuid = getUuid()
        var time = Date.now()
        // 删除所有子节点
        while (div.hasChildNodes()) { 
          div.removeChild(div.firstChild); 
        } 
        data[time] = uuid
        div.appendChild(document.createTextNode(uuid))
        window.location.hash = time
      })
      // 监听url的参数列表(url中#后面的所有字符串)
      EventUtil.addHandler(window, 'hashchange', function (event) {
        event = EventUtil.getEvent(event)
        // 删除所有子节点
        while (div.hasChildNodes()) { 
          div.removeChild(div.firstChild); 
        } 
        var text = data[window.location.hash.substring(1)]
        div.appendChild(document.createTextNode(text))
        console.log(`旧url:${event.oldURL}\n新url:${event.newURL}\n当前hash:${location.hash}`)
      })
    // 获取uuid
    function getUuid () {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0
        var v = c === 'x' ? r : (r & 0x3 | 0x8)
        return v.toString(16)
      }).replace(/-/g, '')
    }
  </script>
</head>
<body>
  <form action="" method="get">
    <label for="mybutton">UUID:</label>
    <input id="mybutton" type="button" value="生成" autofocus name="createBtn">
  </form>
  <div id="uuid"></div>
</body>
</html>

javascript-hashchange事件和历史状态管理实例分析

历史状态管理

状态管理API,能够在不加载新页面的情况下改变浏览器的URL。使用history.pushState()方法。

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="EventUtil.js"></script>
  <script>
    EventUtil.addHandler(window, 'load', function () {
      var form = document.forms[0]
      var elements = form.elements
      var mybutton = elements['createBtn']
      var div = document.getElementById('uuid')
      var data = {}
      EventUtil.addHandler(mybutton, 'click', function (event) {
        event = EventUtil.getEvent(event)
        var target = EventUtil.getTarget(event)
        var uuid = getUuid()
        var time = Date.now()
        // 删除所有子节点
        while (div.hasChildNodes()) { 
          div.removeChild(div.firstChild); 
        } 
        data[time] = uuid
        div.appendChild(document.createTextNode(uuid))
        // 创建新的历史状态
        history.pushState({name: time}, '', 'index.html')
      })
      // 监听浏览器“后退”(返回上一页)事件
      EventUtil.addHandler(window, 'popstate', function (event) {
        event = EventUtil.getEvent(event)
        var state = event.state
        if (state) {
          console.log(state)
        }
      })
    })
    // 获取uuid
    function getUuid () {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0
        var v = c === 'x' ? r : (r & 0x3 | 0x8)
        return v.toString(16)
      }).replace(/-/g, '')
    }
  </script>
</head>
<body>
  <form action="" method="get">
    <label for="mybutton">UUID:</label>
    <input id="mybutton" type="button" value="生成" autofocus name="createBtn">
  </form>
  <div id="uuid"></div>
</body>
</html>

注意

状态管理API只能在服务端调用!

javascript-hashchange事件和历史状态管理实例分析

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Jquery 高亮显示文本中重要的关键字
Dec 24 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
Oct 29 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
Sep 10 Javascript
js实现的常用的左侧导航效果
Oct 17 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
jquery不常用方法汇总
Jul 26 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
JS button按钮实现submit按钮提交效果
Nov 01 Javascript
vue2.0 datepicker使用方法
Feb 04 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
Mar 16 jQuery
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
Apr 08 Javascript
深入了解Vue.js 混入(mixins)
Jul 23 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 #Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 #Javascript
es6函数name属性功能与用法实例分析
Apr 18 #Javascript
es6数组includes()用法实例分析
Apr 18 #Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 #Javascript
es6函数中的作用域实例分析
Apr 18 #Javascript
es6函数之rest参数用法实例分析
Apr 18 #Javascript
You might like
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
php 高效率写法 推荐
2010/02/21 PHP
php array_walk() 数组函数
2011/07/12 PHP
php单例模式实现(对象只被创建一次)
2012/12/05 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
flexigrid 参数说明
2010/11/23 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
jquery实现拖动效果
2016/08/10 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
JavaScript命名空间模式实例详解
2019/06/20 Javascript
Python实现二维曲线拟合的方法
2018/12/29 Python
Python多线程多进程实例对比解析
2020/03/12 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
普通大学毕业生自荐信范文
2014/02/23 职场文书
工商干部先进事迹
2014/05/14 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
认真学习保证书
2015/02/26 职场文书
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS