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 相关文章推荐
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
Dec 28 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
js实现弹窗插件功能实例代码分享
Dec 12 Javascript
node.js中的dns.getServers方法使用说明
Dec 08 Javascript
浅谈JavaScript中指针和地址
Jul 26 Javascript
js实现点击切换TAB标签实例
Aug 21 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
Vue通过懒加载提升页面响应速度
May 10 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
php缓存技术介绍
2006/11/25 PHP
php生成略缩图代码
2012/07/16 PHP
php自定义hash函数实例
2015/05/05 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
python 日期排序的实例代码
2019/07/11 Python
python tornado修改log输出方式
2019/11/18 Python
通过实例学习Python Excel操作
2020/01/06 Python
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
金融事务专业毕业生求职信
2014/02/23 职场文书
求职意向书
2014/04/01 职场文书
法制宣传月活动方案
2014/05/11 职场文书
事业单位个人总结
2015/02/12 职场文书
php引用传递
2021/04/01 PHP
Python的property属性详细讲解
2022/04/11 Python