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 相关文章推荐
070823更新的一个[消息提示框]组件 兼容ie7
Aug 29 Javascript
JavaScript中实现块作用域的方法
Apr 01 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
html的DOM中document对象anchors集合用法实例
Jan 21 Javascript
详解WordPress开发中get_current_screen()函数的使用
Jan 11 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
Jan 19 Javascript
Angular2.js实现表单验证详解
Jun 23 Javascript
js实现随机点名系统(实例讲解)
Oct 18 Javascript
如何自动化部署项目?折腾服务器之旅~
Apr 16 Javascript
一次让你了解全部JavaScript的作用域
Jun 24 Javascript
vuex的使用步骤
Jan 06 Vue.js
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
改变Apache端口等配置修改方法
2008/06/05 PHP
简单谈谈favicon
2015/06/10 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
金讯Java笔试题目
2013/06/18 面试题
入学申请自荐信范文
2014/02/26 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
董事长助理工作职责
2014/06/08 职场文书
工地质量标语
2014/06/12 职场文书
教师节老师寄语
2015/05/28 职场文书
微信小程序调用python模型
2022/04/21 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers