深入理解 hash 和 history:网页导航的基础(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍 hash 和 history 的背景
    • 为什么需要了解 hash 和 history
  • 二、 hash 的基本概念
  • 三、 history 的基本概念
  • 四、 hash 和 history 的区别
    • 比较 hash 和 history 的不同之处
    • 在应用场景中的选择

一、引言

介绍 hash 和 history 的背景

Hash 和 History 是两种不同的路由模式,它们的背景如下:

  • Hash 模式:
    • URL 中的 hash 值只是客户端的一种状态,不会被发送到服务器。
    • hash 值的改变都会在浏览器的访问历史中增加一个记录,因此可以通过浏览器的前进、回退按钮控制 hash 的切换。
    • 可以通过 JavaScript 对 location.hash 进行赋值,来改变 URL 中的 hash 值。
    • 可以用 hashchange 事件监听 hash 值的变化,从而对页面进行跳转并渲染。

在这里插入图片描述

  • History 模式:
    • HTML5 提供了 History API,可以在不进行刷新的情况下,操作浏览器的历史纪录。
    • 可以使用 popstate 事件来监听 URL 的变化,从而对页面进行跳转和渲染。
    • history.pushState()或 history.replaceState()不会触发 popstate 事件,这时需要手动触发页面跳转。

在这里插入图片描述

总的来说,Hash 模式是早期的路由实现方式,而 History 模式则是 HTML5 提供的一种更现代的解决方案。

为什么需要了解 hash 和 history

在前端开发中,了解 hash 和 history 是很重要的,因为它们是实现前端路由的两种主要方式

具体原因如下:

  • 构建SPA(单页面应用):对于 Vue 这类渐进式前端开发框架,为了构建 SPA,需要引入前端路由系统,这也就是 Vue-Router 存在的意义。
  • 实现页面跳转:浏览器提供了两种支持前端路由的方式,即 hash 和 history。通过改变 URL,实现页面跳转,同时不会向后端发送请求。

总的来说,了解 hash 和 history 对于构建高效、用户友好的前端应用程序至关重要。

二、 hash 的基本概念

在前端路由中,hash指的是 URL 中的#符号后面的部分。例如,https://example.com/#/about中的#/about就是一个hash

  1. 什么是 hash: 在前端路由中,hash是指 URL 中#后面的部分。它可以用来在不刷新页面的情况下,通过改变hash值来进行页面的导航。

  2. hash 的特点和用途:

  • 不发送给服务器:浏览器在访问带有hash的 URL 时,不会将hash部分发送给服务器。这意味着服务器端无法获取或处理hash值。
  • 只在客户端生效:hash的变化只在客户端生效,不会导致服务器端的请求或页面刷新。
  • 简单且兼容性好:hash的实现相对简单,并且在大多数浏览器中都得到了很好的支持,包括旧版本的浏览器。
  • 用于前端路由:在单页面应用(SPA)中,前端路由可以利用hash来进行页面的切换。通过监听hashchange事件,可以根据hash的变化来加载不同的页面内容。

在这里插入图片描述

  1. hash 的变化和更新机制: 当用户点击链接或在浏览器中手动修改hash值时,浏览器会触发hashchange事件。在hashchange事件中,可以通过获取当前的hash值来进行相应的页面更新或路由处理。此外,还可以通过使用 History API(如 HTML5 的 History API)来实现更高级的前端路由功能,提供更好的用户体验。

三、 history 的基本概念

在前端路由中,history指的是 History API,它是 HTML5 提供的一种用于管理浏览器历史记录的接口。通过 History API,可以在不刷新页面的情况下,修改 URL 的hash值或使用新的 URL,实现页面的导航和状态管理。

  1. 特点:
  • 不刷新页面:使用 History API 进行页面导航时,不会触发页面的刷新,从而提供了更好的用户体验。
  • 可修改 URL:可以通过修改 URL 的hash值或使用新的 URL,来反映页面的状态变化。
  • 状态管理:结合前端路由框架,可以将页面的状态与 URL 关联起来,实现基于 URL 的状态管理。
  1. 用途:
  • 实现单页面应用(SPA):通过使用 History API,可以在单页面应用中实现页面的路由和状态管理,提供流畅的用户体验。
  • 改善用户体验:避免了页面刷新带来的用户体验问题,如页面内容的丢失、重新加载等。
  • 与服务器端配合:可以与服务器端进行配合,实现服务器端渲染(SSR)或渐进式渲染。
  1. 变化和更新机制: History API 提供了两种方式来修改 URL:
  • hashchange事件:通过修改 URL 的hash值来触发页面的导航。当hash发生变化时,浏览器会触发hashchange事件。
  • History.pushState()和 History.replaceState()方法:可以使用这两个方法来在浏览器历史记录中新增或替换条目,从而修改 URL。这两种方式不会触发页面的刷新。

通过监听hashchange事件或使用 History.pushState()和 History.replaceState()方法,可以在前端路由中根据 URL 的变化来加载不同的页面内容或执行相应的逻辑。同时,也可以通过回退和前进按钮来浏览历史记录中的不同页面状态。

需要注意的是,使用 History API 需要考虑一些兼容性问题,并且在某些情况下可能需要服务器端的配合来处理 URL 的变化。

四、 hash 和 history 的区别

比较 hash 和 history 的不同之处

hashhistory是前端路由中常用的两种方式,它们的主要不同之处在于以下几个方面:

  1. URL 格式:
  • hash方式使用 URL 的hash部分来表示路由状态,例如https://example.com/#/about
  • history方式使用正常的 URL 结构来表示路由状态,例如https://example.com/about
  1. 页面刷新:
  • hash方式的 URL 变化不会触发页面的刷新,因为浏览器认为hash部分是属于页面内部的。
  • history方式的 URL 变化可能会触发页面的刷新,除非使用了特定的技术(如 History API)来处理。
  1. 兼容性:
  • hash方式在所有的浏览器中都能正常工作,包括较旧的浏览器。
  • history方式需要支持 HTML5 History API 的浏览器才能正常工作,较旧的浏览器可能需要使用 polyfill 来实现兼容。
  1. 服务器端处理:
  • hash方式的 URL 变化不会被服务器端感知,因为服务器端只处理 URL 中不带hash部分的请求。
  • history方式的 URL 变化可以被服务器端感知,如果需要在服务器端进行处理,可能需要在服务器端配置相应的路由处理。

总体来说,hash方式更适合简单的单页面应用,而history方式更适合复杂的单页面应用或需要与服务器端进行交互的应用。在选择使用哪种方式时,需要根据具体的需求和项目的特点来进行考虑。

在应用场景中的选择

在应用场景中选择使用hash还是history,可以考虑以下几个因素:

  1. 兼容性:如果应用需要支持较旧的浏览器或移动设备,可能需要选择hash方式,因为它在所有的浏览器中都能正常工作。

  2. 用户体验:如果希望提供更好的用户体验,避免页面刷新,可以选择history方式。hash方式的 URL 中带有#符号,可能会让用户感到困惑。

  3. 服务器端处理:如果应用需要与服务器端进行交互,或者需要在服务器端进行路由处理,可能需要选择history方式。使用hash方式时,服务器端无法感知 URL 中的hash部分。

  4. 应用复杂度:如果应用比较简单,只有少数页面,可能选择hash方式就足够了。如果应用比较复杂,有多个页面或路由状态,可能需要选择history方式来更好地管理路由。

在这里插入图片描述

综合考虑以上因素,可以根据具体的应用场景和需求来选择使用hash还是history。在实际开发中,也可以先使用hash方式进行开发,然后在需要时再迁移到history方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/248691.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样下载微博视频而不至于发生“403 Forbidden“现象?

近段时间不知道从什么时候开始,微博视频都不让从网页下载了。以前是看到有想要下载的微博视频,就点进去微博详情页用谷歌浏览器F12进入调试的方式,选“Network”->“Media”->重新F5刷新页面等待调试框里出现链接->在链接上鼠标右键…

南京农业大学研发古籍版的ChatGPT,AI大语言模型荀子面世

随着科技的飞速发展,人工智能已深入到各个领域。为响应古籍活化利用号召,推动大语言模型与古籍处理深度融合,以古籍智能化的研究为目的,南京农业大学国家社科基金重大项目“中国古代典籍跨语言知识库构建及应用研究”课题组与中华…

如何拍摄超级大像素图片,超级大像素有哪些应用

引言: 在数字摄影领域,超级大像素照片是指通过高像素的相机或拼接多张照片合成的照片。这样的照片具有更高的分辨率,细节更加清晰,绘画质感更强。那么如何拍摄超级大像素照片,超级大像素可以用在哪些领域呢。 一&…

ISSUE的基本概念

ISSUE:将符合一定条件的指令从发射队列(IssueQueue)中选出来,并送到FU中执行的过程; ISSUE QUEUE也称之为reservation station, 其按照一定的规则,选择那些源操作数都已经准备好的指令,将其送到FU中执行,这个过程称为…

最新50万字312道Java经典面试题52道场景题总结(附答案PDF)

最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里、腾讯、字节跳动、京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题;花了3个月的时间将市面上所有的面试题整理总结成了一份50万字的300道Java高频面…

TCP服务器的编写(上)

tcp服务器的初始化,第一件事情就是创建套接字 目前来说我们的tcp套接和udp套接是没有任何区别的!!! 那么接下来,如果是udp创建好套接字在进行绑定,那么基本上就完成我们udp服务器的初始化 而我们tcp创建好…

题目:二进制中1的个数 (蓝桥OJ 1331)

题目描述: 解题思路: 使用位运算.右移并判断最低位是否为一.但需要注意一般的int类型不行,要使用unsigned int. 题解: #include <bits/stdc.h> using namespace std; int main() {unsigned int x;cin >> xint ans 0;while(x){if(x & 1)ans;x >> 1;}c…

算法基础概念之数据结构

邻接表 每个点作为头节点接一条链表 链表中元素均为该头节点指向的点 优先队列 参数: ①储存元素类型 ②底层使用的存储结构(一般为vector) ③比较方式(默认小于)

使用React实现随机颜色选择器,JS如何生成随机颜色

背景 在标签功能中&#xff0c;由于有「背景色」属性&#xff0c;每次新增标签时都为选择哪种颜色犯难。因此&#xff0c;我们思考如何通过JS代码生成随机颜色&#xff0c;提取一个通用的随机颜色生成工具&#xff0c;并基于React框架封装随机颜色选择器组件。 实际效果 原理…

Vue用<br>自定义换行,用v-html渲染,hover的时候title也需要使用自定义换行或者显示一行用省略号展示,hover展示全部

哈喽 大家好啊,最近遇到一个需求&#xff1a; 需求一&#xff1a;用<br>自定义换行&#xff0c;hover的时候title也需要使用自定义换行 然后我便想到了用<br>自定义换行&#xff0c;然后用v-html渲染&#xff0c;则就正常显示了 但是title只能用文本&#xff0c…

数据结构--稀疏矩阵及Java实现

一、稀疏 sparsearray 数组 1、先看一个实际的需求 编写的五子棋程序中&#xff0c;有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。 2、稀疏数组基本介绍 当一个数组中大部分元素为&#xff10;…

[NAND Flash] 3.3 Flash闪存工艺知识深度解析

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 全文 3800 字。 1. Wafer 1.1 什么是 Wafer Wafer即晶圆&#xff0c;是半导体组件“晶片”或“芯片”的基材&#xff0c;从沙子里面…

【idea】idea尾部自动删除空格,idea2023.1.2关闭自动去除行尾空格的功能

这个功能是由于git或者svn上的代码有许多空格的时候&#xff0c;会自动把空格去掉&#xff0c;就会导致出现许多更改的地方&#xff0c;会自动删空格。 尾部刚打好空格准备写代码&#xff0c;自动就删掉空格&#xff0c;又得重打空格后继续编码&#xff0c;非常不爽。 设置如…

Kubernetes 的用法和解析 -- 2

一.集群常用指令 1.1 基础控制指令 # 查看对应资源: 状态 $ kubectl get <SOURCE_NAME> -n <NAMESPACE> -o wide [rootkube-master ~]# kubectl get pods -n kuboard -o wide# 查看对应资源: 事件信息 $ kubectl describe <SOURCE_NAME> <SOURCE_NAME_R…

maven工程中读取resources中的资源文件

maven工程的代码布局如下&#xff1a;在resources下面有一个资源文件test.properties&#xff0c;现在的目标要在Java代码中读取该资源文件中的内容。 test.properties资源文件的内容如下&#xff1a; Java代码如下&#xff1a; package com.thb;import java.io.BufferedR…

vue 在for循环中设置ref并获取$refs

一、单循环动态设置ref 1.设置&#xff1a;【:ref“‘XXX’ index”】XXX -->自定义ref的名字 2.获取&#xff1a;let ref eval(‘this.$refs.XXX’ index)[0] 3.示例&#xff1a; 代码如下所示 <template><div class"ref_test"><div v-fo…

Python封装ADB获取Android设备wifi地址的方法

一、代码实现 import subprocessimport re import subprocessfrom common.logger import loggerdef get_device_wifi_address(udid):ip_command fadb -s {udid} shell ip routeresult subprocess.check_output(ip_command, shellTrue, textTrue)# 提取 IP 地址ip_address r…

ubuntu安装详细步骤

一&#xff0c;先下载vmware 1&#xff0c;第一步打开上面链接 下载网址 : https://www.vmware.com/products/workstation-pro/wo rkstation-pro-evaluation.html 许可证 JU090-6039P-08409-8J0QH-2YR7F ZF3R0-FHED2-M80TY-8QYGC-NPKYF FC7D0-D1YDL-M8DXZ-CYPZE-P2AY6 ZC3T…

初识JVM底层知识,一文读懂JVM知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

网络基础2

三层交换机&#xff1a;路由器交换机 创建vlan 配置0/0/2串口为vlan2&#xff0c;3接口为vlan3 三层交换机的串口是不能直接配置地址&#xff0c;要在虚拟接口&#xff08;vlan的接口&#xff09;配置IP地址 配置vlan1的虚拟接口 此时vlan1的主机能ping通三层交换机串口1的地址…