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 相关文章推荐
网页中CDATA标记的说明
Sep 12 Javascript
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
JS 操作符整理[推荐收藏]
Nov 15 Javascript
给jQuery方法添加回调函数一款插件的应用
Jan 21 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
js截取小数点后几位的写法
Nov 14 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
js实现九宫格图片半透明渐显特效的方法
Feb 16 Javascript
前端框架Vue.js中Directive知识详解
Sep 12 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
深入剖析JavaScript instanceof 运算符
Jun 14 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
笑谈配置,使用Smarty技术
2007/01/04 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python兔子毒药问题实例分析
2015/03/05 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python2与python3共存问题的解决方法
2018/09/18 Python
python如何制作英文字典
2019/06/25 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python中如何使用insert函数
2020/01/09 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
浅析python实现动态规划背包问题
2020/12/31 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
银河香水:Galaxy Perfume
2019/03/25 全球购物
宠物店的创业计划书范文
2014/01/11 职场文书
《童趣》教学反思
2014/02/19 职场文书
学校中秋节活动总结
2015/03/23 职场文书
新闻稿格式范文
2015/07/18 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
ant design vue的form表单取值方法
2022/06/01 Vue.js
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS