当前位置: 首页 > news >正文

HTML5-原生History

history


浏览器历史记录对象

属性:
  • length: 历史记录对象长度
方法:
  • go(n):

    跳转到相应的历史记录,以当前历史记录为标准线0,回到之前历史记录,为负值,比如回到上一页,n就是-1,向后,就是正值,如果n === 0,相当于刷新当前页面。

  • back():

    回到上一页,相当于浏览器后退按钮,也可以用go(-1)实现

  • forward():

    前进到下一页,相当于浏览器前进按钮,也可以用go(1)实现

HTML5 对 History API 新增的两个方法:pushState()、replaceState(),均具有操纵浏览器历史记录的能力

  • history.pushState(state, title, url)

    • state:用于存储该 url 对应的状态对象,可以通过 history.state 获取
    • title:标题,目前浏览器并不支持
    • url:定义新的历史 url 记录,需要注意,新的 url 必须与当前 url 同源,不能跨域

    pushState 函数会向浏览器的历史记录中添加一条,history.length 的值会 +1,当前浏览器的 url 变成了新的 url。需要注意的是:仅仅将浏览器的 url 变成了新的 url,页面不会加载、刷新。

  • replaceState:

    replaceState 的使用与 pushState 非常相似,都是改变当前的 URL,页面不刷新。区别在于 replaceState 是修改了当前的历史记录项而不是新建一个,history.length 的值保持不变。

监听事件


1. popstate事件

每当history对象出现变化时,就会触发popstate事件。

通过 a 标签或者 window.location 进行页面跳转时,都会触发 window.onload 事件,页面完成渲染。点击浏览器的后退键或前进键,根据浏览器的不同机制,也会重新加载(Chrome 浏览器),或保留之前的页面(Safari 浏览器)。而对于通过 history.pushState() 或 history.replaceState() 改变的历史记录,点击浏览器的后退键或前进键页面是没有反应的,那该如何控制页面渲染呢?为了配合 history.pushState() 或 history.replaceState(),HTML5 还新增了一个事件,用于监听 URL 历史记录改变:window.onpopstate()。

注意事项:

  • 仅仅调用pushState()方法或replaceState()方法 ,并不会触发该事件;

  • 只有用户点击浏览器倒退按钮和前进按钮,或者使用 JavaScript 调用History.back()、History.forward()、History.go()方法时才会触发;

  • 单纯的a标签不会触发;

  • 另外,上面浏览器回退和前进事件只针对同一个文档,如果浏览历史的切换,导致加载不同的文档,该事件也不会触发。页面第一次加载的时候,浏览器不会触发popstate事件。使用的时候,可以为popstate事件指定回调函数,回调函数的参数是一个 event 事件对象,它的 state 属性指向当前的 state 对象;

2. hashchange事件

每当hash值发生变化时,就会触发hashchange事件,hash值的变化也会触发popstate事件

注意事项:


  • 仅仅调用pushState()方法或replaceState()方法 ,并不会触发该事件;

  • 另外,上面浏览器回退和前进事件只针对同一个文档,如果浏览历史的切换,导致加载不同的文档,该事件也不会触发。页面第一次加载的时候,浏览器不会触发hashchange事件。使用的时候,可以为hashchange事件指定回调函数,回调函数的参数是一个 event 事件对象,它的 state 属性指向当前的 state 对象。

更多内容,访问:

history
hash
单页面应用和多页面应用
React-Router源码分析-History库
History库源码分析-Action 动作类型
History库源码分析-createLocation
History库源码分析-createPath
History库源码分析-parsePath

相关文章:

  • 解决vue 部分页面缓存,部分页面不缓存的问题
  • 2023.11.15 关于 Spring Boot 配置文件
  • 基于Vue+SpringBoot的农村物流配送系统 开源项目
  • 使用composer安装ffmpeg的步骤
  • 数组相关面试题--5.合并两个有序数组
  • LEEDCODE 220 存在重复元素3
  • 数据分析场景下,企业如何做好大模型选型和落地?
  • 通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件
  • 12 Go的接口
  • System.lineSeparator() 解决 append(“\r\n“) 换行符抛异常:No such file or diretory
  • 【C++】:STL——标准模板库介绍 || string类
  • how to find gcc openbug
  • 【计算机网络】TCP协议
  • 【Kingbase FlySync】命令行:同步软件安装部署,并实现KES到KES实现同步迁移
  • 基于pytest-bdd的项目目录结构和命名规范
  • 《Java编程思想》读书笔记-对象导论
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • const let
  • Laravel 实践之路: 数据库迁移与数据填充
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Shell编程
  • Spring声明式事务管理之一:五大属性分析
  • 程序员最讨厌的9句话,你可有补充?
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于 Babel 的 npm 包最小化设置
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 今年的LC3大会没了?
  • 新版博客前端前瞻
  • 移动端 h5开发相关内容总结(三)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 函数计算新功能-----支持C#函数
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 达梦数据库知识点
  • (02)vite环境变量配置
  • (4)Elastix图像配准:3D图像
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (一)基于IDEA的JAVA基础12
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转载)hibernate缓存
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net 调用php,php 调用.net com组件 --
  • @JsonFormat与@DateTimeFormat注解的使用
  • [AIGC] Java 和 Kotlin 的区别
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [CTSC2014]企鹅QQ
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [IE编程] IE 是如何决定Accept-Language 属性的
  • [javaSE] GUI(事件监听机制)