SPA是如何通过js不刷新页面但是更新浏览器的url的?

不刷新页面但更新浏览器 URL 的两种方式

概述

在不刷新页面的情况下更新浏览器 URL,可以通过两种方式实现:

  1. History API :通过 history.pushState()history.replaceState() 间接更改 URL。
  2. Hash Routing :通过修改 URL 的 hash 直接更改 URL。

两种方式的本质都是更改 URL,但 History API 更现代且 URL 更简洁,而 Hash Routing 兼容性更好,适合旧浏览器。


1. 通过 History API

参考MDN History API

更改 URL

使用以下 API 更改 history 对象:

  • history.pushState(state, unused, url):添加新历史记录。
  • history.replaceState(state, unused, url):替换当前历史记录。

历史导航

使用以下方法进行历史记录的前进和回退:

  • history.back():回退到上一个历史记录。
  • history.forward():前进到下一个历史记录。
  • history.go(delta):跳转到指定历史记录。

UI 更新

  • pushStatereplaceState 不会触发页面刷新或事件,因此需要手动更新 UI。

2. 通过 URL Hash

更改 URL

通过 location.hash 直接修改 URL 的 hash 部分:

javascript 复制代码
location.hash = 'hashValue';

UI 更新

  • 手动更新 UI,或通过监听 hashchange 事件自动更新 UI:
javascript 复制代码
window.addEventListener('hashchange', () => {
    console.log('Hash changed:', location.hash);
});

自定义前进后退

  • 需要手动维护两个栈(backStackforwardStack)来存储 hash 的变化历史。

对比与选择

  • History API:更现代,URL 更简洁,但需要手动更新 UI。
  • Hash Routing :兼容性更好,适合旧浏览器,但 URL 中包含 #

总结

通过 History API 和 Hash Routing,可以在不刷新页面的情况下更新浏览器 URL。History API 适合现代应用,而 Hash Routing 兼容性更强,适合旧浏览器。

相关推荐
翻滚吧键盘3 分钟前
vue绑定一个返回对象的计算属性
前端·javascript·vue.js
苦夏木禾8 分钟前
js请求避免缓存的三种方式
开发语言·javascript·缓存
超级土豆粉16 分钟前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
秃了也弱了。22 分钟前
Chrome谷歌浏览器插件ModHeader,修改请求头,开发神器
前端·chrome
乆夨(jiuze)43 分钟前
记录H5内嵌到flutter App的一个问题,引发后面使用fastClick,引发后面input输入框单击无效问题。。。
前端·javascript·vue.js
忧郁的蛋~1 小时前
HTML表格导出为Excel文件的实现方案
前端·html·excel
小彭努力中1 小时前
141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
前端·javascript·vue.js·交互
然我1 小时前
别再只用 base64!HTML5 的 Blob 才是二进制处理的王者,面试常考
前端·面试·html
NanLing1 小时前
【纯前端推理】纯端侧 AI 对象检测:用浏览器就能跑的深度学习模型
前端
呆呆的心1 小时前
前端必学:从盒模型到定位,一篇搞定页面布局核心 🧩
前端·css