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代码
Nov 08 Javascript
浅谈Jquery为元素绑定事件
Apr 27 Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 Javascript
js获取微信版本号的方法
May 12 Javascript
javascript实现检验的各种规则
Jul 31 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
jQuery解析json数据实例分析
Nov 24 Javascript
jQuery使用经验小技巧(推荐)
May 31 Javascript
JS新包管理工具yarn和npm的对比与使用入门
Dec 09 Javascript
Vue中使用vee-validate表单验证的方法
May 09 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
Sep 13 Javascript
微信小程序利用云函数获取手机号码
Dec 17 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和ACCESS写聊天室(一)
2006/10/09 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
用python代码做configure文件
2014/07/20 Python
python中引用与复制用法实例分析
2015/06/04 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
在python里面运用多继承方法详解
2019/07/01 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
简述 Python 的类和对象
2020/08/21 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
大学社团活动策划书
2014/01/26 职场文书
统计岗位职责
2014/02/21 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
vue判断按钮是否可以点击
2022/04/09 Vue.js