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 相关文章推荐
不用写JS也能使用EXTJS视频演示
Dec 29 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
更快的异步执行(setTimeout多浏览器)
Aug 12 Javascript
Vue.js基础知识小结
Jan 13 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
Mar 08 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
详解angular笔记路由之angular-router
Sep 12 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
Feb 07 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
May 20 Javascript
简单了解小程序+node梳理登陆流程
Jun 24 Javascript
js实现抽奖的两种方法
Mar 19 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
Exjs 入门篇
2010/04/07 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
javascript学习之json入门
2016/12/22 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
Python 2与Python 3版本和编码的对比
2017/02/14 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
工商管理应届生求职信
2013/10/07 职场文书
口头翻译求职人自荐信
2013/12/07 职场文书
付款委托书范本
2014/04/04 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
公司经营目标责任书
2015/01/29 职场文书
领导视察通讯稿
2015/07/18 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
从原生JavaScript到React深入理解
2022/07/23 Javascript