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 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
javascript onmouseout 解决办法
Jul 17 Javascript
display和visibility的区别示例介绍
Feb 26 Javascript
jquery选择符快速提取web表单数据示例
Mar 27 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
JavaScript基础知识学习笔记
Dec 02 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
angular select 默认值设置方法
Jun 23 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
Vuex中mutations与actions的区别详解
Mar 01 Javascript
vue源码nextTick使用及原理解析
Aug 13 Javascript
node中短信api实现验证码登录的示例代码
Jan 20 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
php 采集书并合成txt格式的实现代码
2009/03/01 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
python 域名分析工具实现代码
2009/07/15 Python
Python中的文件和目录操作实现代码
2011/03/13 Python
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
java关于string最常出现的面试题整理
2021/01/18 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
GWebs公司笔试题
2012/05/04 面试题
Java基础类库面试题
2013/09/04 面试题
酒店管理毕业生自荐信
2014/05/25 职场文书
安全宣传标语
2014/06/10 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js