【JavaScript】前端路由原理之 hash 模式和 history 模式

JavaScript的路由 JavaScript的hash路由和history的实现方式! 阅读详情

什么是路由?

个人理解路由就是浏览器 URL 和页面内容的一种映射关系。

比如你看到我这篇博客,博客的链接是一个 URL,而 URL 对应的就是我这篇博客的网页内容,这二者之间的映射关系就是路由。

其中路由又分为前端路由和后端路由,由于目前是大部门开发模式都是前后端分离开发模式,其大部分应用都是 SPA(simple Page Application,单页面应用),个人的工作也是由后端提供API,我前端来进行整个页面的渲染和路由控制。

前端路由目前实现的原理主要是:URL 的 hash、HTML5 的 History

hash 模式

浏览器提供了一些 api 可以让我们获取到URL中带“#”的标识。比如 URL.hash、location.hash。

同时我们可以通过 hashchange 事件来监听hash值的改变,这样就能通过事件监听 url 中 hash 的改变从而改变特定页面元素的显示内容,从而实现前端路由。简单实现代码如下:image

<div id="app">
	<a href="#/home">home</a>
	<a href="#/about">about</a>

	<div class="router-view"></div>
</div>
// 1.获取路由显示元素
const routerViewEl = document.querySelector('.router-view');

// 2.监听 hashchange 事件
window.addEventListener('hashchange', () => {
  // 3.判断 hash 的改变值,修改路由显示元素的 innerHTMl
  switch (location.hash) {
    case '#/home':
      routerViewEl.innerHTML = 'Home';
      break;
    case '#/about':
      routerViewEl.innerHTML = 'about';
      break;
    default:
      routerViewEl.innerHTML = 'default';
  }
});

History 模式

history 接口是 HTML5 新增的, 它有六种模式改变 URL 而不刷新页面。

  • pushState:使用新的路径;
  • replaceState:替换原来的路径;
  • popState:路径的回退;
  • go:向前或向后改变路径;
  • forward:向前改变路径;
  • back:向后改变路径;

其中比较重要的两个 api 是 pushState 和 replaceState 是比较重要的,是实现 history 模式的重要 api。

首先我们用 pushState 来简单实现下,代码如下:image

<div id="app">
	<a href="/home">home</a>
	<a href="/about">about</a>

	<div class="router-view"></div>
</div>
// 1.获取路由显示元素
const routerViewEl = document.querySelector('.router-view');

// 2.获取所有路由跳转元素
const aEls = document.getElementsByTagName('a');
// 3.遍历所有 a 元素,注册事件监听点击
for (let aEl of aEls) {
  aEl.addEventListener('click', (e) => {
    // 4.阻止默认跳转
    e.preventDefault();
    // 5.获取 href 属性
    const href = aEl.getAttribute('href');
    // 6.执行 history.pushState
    history.pushState({}, '', href);
    // 7.判断 pathname 路径的改变
    switch (location.pathname) {
      case '/home':
        routerViewEl.innerHTML = 'Home';
        break;
      case '/about':
        routerViewEl.innerHTML = 'about';
        break;
      default:
        routerViewEl.innerHTML = 'default';
    }
  });
}

相同之处是两个 API 都会操作浏览器的历史记录,而不会引起页面的刷新。

不同之处在于,pushState 会增加一条新的历史记录,而 replaceState 则会替换当前的历史记录。其内部原理是 pushState 每次前进一次页面都是入栈操作,每次返回又是出栈,因此使用 pushState ,浏览器可以执行本身的前进后退操作,其内部就是一个入栈出栈;而 replaceState 就不可,它是把每次栈底的数据替换,而不是入栈。

pushState 栈:[]->点击 home 入栈->[home]->点击 about 入栈->[home,about]->浏览器回退,about 出栈->[home]
replaceState 栈:[]->点击 home 入栈->[home]->点击 about 替换栈底->[about]

如果把代码改成 replaceState 实现。那么就不能操作浏览器上面的前进后退操作。

image

// 1.获取路由显示元素
const routerViewEl = document.querySelector('.router-view');

// 2.获取所有路由跳转元素
const aEls = document.getElementsByTagName('a');
// 3.遍历所有 a 元素,注册事件监听点击
for (let aEl of aEls) {
  aEl.addEventListener('click', (e) => {
    // 4.阻止默认跳转
    e.preventDefault();
    // 5.获取 href 属性
    const href = aEl.getAttribute('href');
    // 6.执行 history.replaceState
    // history.pushState({}, '', href);
    history.replaceState({}, '', href);
    // 7.判断 pathname 路径的改变
    switch (location.pathname) {
      case '/home':
        routerViewEl.innerHTML = 'Home';
        break;
      case '/about':
        routerViewEl.innerHTML = 'about';
        break;
      default:
        routerViewEl.innerHTML = 'default';
    }
  });
}

参考文章

前端路由的两种实现原理

钰溪-vue.js前端路由及异步组件 hash hashchange事件:可以监听hash路由的变化 history 1.方法 pushState(data, title, ?url):不会触发popstate replaceState(data, title, ?url):不会触发popstate back forward go popstate事件:可以监听浏览器的前进回退按钮和js的back、forward、go方法 hash和history的区别 形式上hash会在域名后面加上‘#’,history不会 事件上,监听hash用的是 阅读详情

相关推荐

【高频考点精讲】前端路由原理深度解析:从hash到history API

今天咱们聊聊前端路由那点事儿。作为一个在前后端反复横跳的老司机,全栈老李发现很多同学对路由的理解还停留在"会用vue-router"的层面,这就像只会开车却不懂发动机原理一样危险啊!

全栈老李的博客 959

vuejs中路由器的两种模式-哈希模式与历史模式

虽互不曾谋面,但希望能和您成为笔尖下的朋友以读书,技术,生活为主,偶尔撒点鸡汤不作,不敷衍,意在真诚吐露,用心分享点击左上方,可关注本刊标星公众号(ID:itclanCoder)如果不知道如何操作点击这里,标星不迷路前言路由器分别有两种模式,一种是hash模式,另一种是history模式,在使用vue-cli以及vue-router默认搭建的vue项目,如果不做特殊的配置...

itclanCoder 2917

从零开始:手把手教你设计DP接口电路(含原理图实战)

本文是一份详尽的DisplayPort接口电路设计实战指南。文章从DP接口的核心架构与HDMI的差异讲起,手把手解析了高速差分对、AUX辅助通道、热插拔检测等关键模块的原理图设计要点,并提供了一个完整的DP Source端原理图实例,最后总结了PCB布局与信号完整性的核心考量,旨在帮助硬件工程师高效、稳定地完成DP接口电路设计。

transformer2023的博客 732

nginx - history模式路由刷新404问题

本文介绍了前端单页面应用(SPA)中的两种路由实现方式:hash模式和history模式。hash模式通过监听URL中的hash变化实现页面切换,不会重新加载页面;history模式利用HTML5的History API更新URL而不发起请求,但刷新页面可能导致404错误。文章详细分析了history模式404问题的原因,并给出了通过nginx配置try_files指令的解决方案。最后对比了两种模式的优缺点:hash模式兼容性好但URL不美观,history模式URL简洁但需要服务器额外配置。开发者应根据项

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 1297

从AMCL到SLAM Toolbox:在Nav2中实现高精度纯定位的实践指南

本文详细介绍了从AMCL迁移到SLAM Toolbox纯定位模式的实践指南,帮助开发者在Nav2中实现高精度定位。通过对比AMCL与SLAM Toolbox的性能差异,提供环境配置、参数调优、Nav2集成等关键步骤,显著提升机器人在动态环境中的定位精度和重定位效率。

weixin_29292535的博客 147

【VisualStdio】手把手教你做一个上位机(1)控件设计布局

网上有很多形形色色的制作上位机教程,有些写的挺好的,但是过于单调。

m0_73409202的博客 5435

js设计模式:路由模式

js设计模式:路由模式

m0_54741495的博客 882

西门子S7-200SMART控制步进电机(五)

前面详细讲述了运动控制向导的配置和运动控制指令的使用方法,接下来要讲的是简单程序的编写和调试。 在编写程序时,需要注意的是自定义的符号和地址不能与运动控制向导分配的存储器冲突。 一、软硬件组成 1、软件:STEP-7-Micro/WIN SMART软件; 2、硬件:西门子S7-200 SMART ST40 PLC、57步进电机和驱动器(DM542)。 二、手动控制步进电机旋转方向和速度 具体步骤...

qq_43134642的博客 2万+

浅谈前端路由原理hash和history

浅谈前端路由原理hash和history

Jack, what else can you do besides holding your little darling? 2025

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8279

【ESP32CAM+Android+OpenCV】自定义目标数据集、训练自己的OpenCV模型部署到手机APP并对ESP32CAM无线图传显示并实时检测识别目标_资料编号30

本项目实现自定义目标数据集(想检测什么就检测什么,按照本文教程自己来更换目标)、训练自己的OpenCV模型实时检测识别(pycharm工程)。手机APP(Android studio工程)部署OpenCV模型实现对ESP32CAM(arduino工程)无线WIFI图传过来的图像实时检测识别。 本文以火焰检测识别为例进行演示,通过该过程,结合本文可自定义尝试更换为其它目标的检测,例如更换为车辆、车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物、建筑、损伤等等部署进行检测。

嵌入式阿齐Archie 3478

前端路由简介以及vue-router实现原理

后端路由简介 路由这个概念最先是后端出现的。在以前用模板引擎开发页面时,经常会看到这样 http://www.xxx.com/login 大致流程可以看成这样: 浏览器发出请求 服务器监听到80端口(或443)有请求过来,并解析url路径 根据服务器的路由配置,返回相应信息(可以是 html 字串,也可以是 json 数据,图片等) 浏览器根据数据包的 ...

guxin_duyin的博客 231

论文翻译:arxiv-2023 Do-Not-Answer: A Dataset for Evaluating Safeguards in LLMs

随着大型语言模型(LLMs)的快速发展,出现了新的、难以预测的有害能力。这要求开发者能够通过评估“危险能力”来识别风险,以便负责任地部署LLMs。在这项工作中,我们收集了第一个开源数据集,用于评估LLMs中的安全保障,并以低成本部署更安全的开源LLMs。我们的数据集经过策划和筛选,只包含负责任的语言模型不应遵循的指令。我们注释并评估了六个流行的LLMs对这些指令的响应。基于我们的注释,我们继续训练了几个类似BERT的分类器,并发现这些小型分类器在自动安全评估上能够取得与GPT-4相当的成果。

CSPhD-winston的博客 1131

vue学习笔记

一.vue环境搭建 参考博文:https://www.cnblogs.com/hellman/p/10985377.html vue官网地址: https://cn.vuejs.org/v2/guide/ 二:vue项目目录介绍 1、build:构建脚本目录     1)build.js ==> 生产环境构建脚本;     2)check-versions.js ==> 检查npm,node.js版本;     3)utils.js ==&...

hairongok353043059的专栏 235

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1058

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Vue全家桶(五)之Vue-Router路由 (概念及基本使用)

Vue-router 路由🔥 路由 地址 Vue-router 路由 (概念及基本使用)🔥 https://blog.youkuaiyun.com/m0_55990909/article/details/123957200 Vue-router 路由 (常见用法) 🔥 https://blog.youkuaiyun.com/m0_55990909/article/details/123981283 路由的基本概念与原理 路由是一个比较广义和抽象的概念,路由的本质就是对应关系。 在开发中,路由分为: 后端

m0_55990909的博客 868

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【8 Vue全家桶 - Vue-Router详解】

路由(Routing)是指确定应用程序如何响应特定URL路径的过程。在Web开发中,路由用于将不同的URL路径映射到不同的处理程序或页面上。

qq_31421983的博客 168

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

前端路由原理及hash模式和history模式和Abstract模式

路由模块的本质就是建立起url和页面之间的映射关系,“更新视图但不重新请求页面”是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有两种方式:利用 url 中的hash('#') 和利用History在 Html5中新增的方法。在history模式中url就像正常的url,不过这种模式需要后台配置的支持,因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器中直接访问的时候就会返回404;前端路由的核心在于改变视图的同时不会向后端发出请求,而是去加载路由对应的组件;

zheshihuahua的博客 1402

JS 前端路由:单页面应用的路由原理和实现

JS 前端路由:单页面应用的路由原理和实现 文章目录JS 前端路由:单页面应用的路由原理和实现简介参考完整示例代码正文从页面刷新到路由跳转单页面应用的优劣前端路由分类前端路由实现项目架构Hash 实现History 实现结语 简介 在浏览器的默认行为中,不同的 url 就对应着不同的资源。这就表示当我们使用路径来区别一个网页的不同页面的时候,实际上浏览器就必须从服务端将不同页面加载下来解析然后展示,而这也是传统页面的做法。 下面我们来介绍一种当前更流行,并将异步交互体验发挥到极致的网页:单页面应用(SPA

超悠閒的博客 6043

Vue.js 中hash路由和history路由原理及优缺点

Vue.js 中hash路由和history路由原理及优缺点 hash模式: 原理: 在 url 中的 # 之后对应的是 hash 值, 其原理是通过hashChange() 事件监听hash值的变化, 根据路由表对应的hash值来判断加载对应的路由加载对应的组件 优点: (1) 只需要前端配置路由表, 不需要后端的参与 (2) 兼容性好, 浏览器都能支持 (3) hash值改变不会向后端发送请求, 完全属于前端路由 缺点: (1) hash值前面需要加#, 不符合url规范,也不美观 history模

qq_39454432的博客 8371

简单的了解下前端路由 hash 与 history 差异

前言没了解这两种路由前,不管是vue还是react在项目创建时难免会进行路由之间选择,在hash和history难免会纠结一番,或者是直接稀里糊涂用了默认带#的hash路由,看完这篇分享,保准让你之后不会在为选择哪中路由犯难,实现按需选择。有疑问欢迎在评论区指出,大家一起沟通。简单介绍 Vue RouterVue Router是Vue.js[1]...

前端达人 344

Vue Router的路由模式 hash 和 history 的实现原理

Vue Router的路由模式 hash 和 history 的实现原理 1. hash 模式的实现原理: 早期的前端路由的实现就是基于 location.hash 来实现的,其实他的原理很简单, location.hash 的值就是URL中 # 后面的内容 如:[https://www.word.com#search](https://www.word.com#search) 它的location.hash的值是 #search hash 路由模式的实现主要是基于下面几个特点: URL 中的 has

weixin_52688746的博客 3202

深入了解前端路由 hash 与 history 差异

点击上方前端Q,关注公众号回复加群,加入前端Q技术交流群前言没了解这两种路由前,不管是vue还是react在项目创建时难免会进行路由之间选择,在hash和history难免会纠结一番,或者是直接稀里糊涂用了默认带#的hash路由,看完这篇分享,保准让你之后不会在为选择哪中路由犯难,实现按需选择。有疑问欢迎在评论区指出,大家一起沟通。简单介绍 Vue...

LuckyWinty的博客 209

前端路由深度指南:从 Hash 到 History 模式的无刷新导航原理与部署实践

::: tip 🎯 核心问题 **为什么有些网站切换页面时不会白屏刷新,流畅得如同原生 App?** 这就是前端路由(Frontend Routing)的魔力所在。本篇技术指南将带你从传统"翻页式"网站导航走进单页应用(SPA)的"滑屏式"世界,彻底理解前端路由的工作模式(Hash / History)、底层实现原理、服务器部署配置要点,以及路由懒加载、路由守卫等实战技巧——读完你将具备独立排查

gitblog_01019的博客 210

HoRain云--前端路由原理全解析:Hash vs History

本文详细解析了前端路由的两种核心实现机制:Hash模式和History模式。Hash模式利用URL锚点(#)实现,兼容性好但URL不美观;History模式基于HTML5 API,URL简洁但需要服务端支持。文章通过流程图和代码示例对比了两种模式的特点、适用场景及实现方式,并介绍了路由守卫、动态路由等进阶概念。帮助开发者深入理解前端路由原理,为SPA应用开发提供技术选型参考。

2401_86544677的博客 363

Vue-Router中的hash模式和history模式

history路由原理:利用window.history(history.pushState或history.replaceState)相关api实现路由跳转,从而改变页面内容。由于通过history的api进行路由跳转,并不会向服务器发起请求,也达到了前端路由的目的。history需要后端配合,否则页面刷新,或者根据路径直接访问项目会报404错误,因为打包后的文件一般只有index.html文件和一些打包后的js文件及文件夹,所以需要后端重定向到首页,进入项目后,再进行路由匹配。

m0_67014092的博客 588
上一篇: 【设计模式】面向对象的JavaScript(多态、封装、继承)
下一篇: 【Git】Github 创建仓库了如何第一次提交
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值