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

news2024/12/23 7:58:23

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过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方式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基础篇】1.1 认识STM32(二)

3.3 VREF/VREF-引脚 VREF和VREF-是STM32中用于提供参考电压的引脚。如下图: VREF引脚可以连接一个单独的外部参考电压,范围在2.0V~VDDA,但不能超过VDDA,否则就超过了模拟器件的最大供电电压。在100引脚的封装中&#…

西工大网络空间安全学院计算机网络实验五——ACL配置

实验五、ACL配置 一. 实验目的 1. 掌握ACL的基本配置方法 二. 实验内容 1. 基于如下图所示的拓扑图,对路由器进行正确的RIP协议配置; ​ 首先引入3台2811 IOS15型号的路由器、3台2950-T24型号的交换机、4台PC-PT型号的PC机、两台Server-PT型号的服务…

深圳锐科达IP网络广播系统

深圳锐科达IP网络广播系统 网络音频广播系统是一种基于TCP/IP网络的纯数字音频广播系统。该网络音频广播系统在物理结构上与标准IP网络完全集成。它不仅真正实现了基于TCP/IP网络的数字音频的广播、直播和点播,而且利用TCP/IP网络的优势,突破了传统模拟广…

Goldstein枝切法对存在间断相位缺陷的解缠研究

摘要: Goldstein枝切法作为相位解缠中路径积分法的重要算法之一,其解缠结果易受到噪声或间断相位缺陷所引起的残差点影响。为了研究相位间断缺陷对解缠算法的影响,模拟了具有间断相位缺陷的数据,采用 Gold-stein枝切法进行了系统的解缠研究。…

二百一十五、Flume——Flume拓扑结构之复制和多路复用的开发案例(亲测,附截图)

一、目的 对于Flume的复制和多路复用拓扑结构,进行一个小的开发测试 二、复制和多路复用拓扑结构 (一)结构含义 Flume 支持将事件流向一个或者多个目的地。 (二)结构特征 这种模式可以将相同数据复制到多个channe…

C语言的system函数简介

函数原型 包含在头文件 “stdlib.h” 中 int system(const char * command) 函数功能 执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名。另,在windows系统下参数字符串不区分大小写。 说明:在windows系统中&…

机器翻译:跨越语言边界的智能大使

导言 机器翻译作为人工智能领域的瑰宝,正在以前所未有的速度和精度,为全球沟通拓展新的可能性。本文将深入研究机器翻译的技术原理、应用场景以及对语言交流未来的影响。 1. 简介 机器翻译是一项致力于通过计算机自动将一种语言的文本翻译成另一种语言的…

Apache Struts 代码执行漏洞风险通告

最近,亚信安全CERT通过监控发现,Apache官方披露了Apache Struts 代码执行漏洞(CVE-2023-50164)。攻击者可以利用文件上传参数进行路径遍历,并在某些情况下上传恶意文件,从而执行任意代码。 Apache Struts 是…

Notion开源平替知识库软件AFFiNE本地部署与公网访问远程协作

文章目录 前言1. 使用Docker安装AFFINE2. 安装cpolar内网穿透工具3. 配置AFFINE公网访问地址4. 实现公网远程访问AFFINE5. 结语 前言 本篇文章讲解Notion开源平替全能知识库工具AFFINE如何本地部署,并实现公网远程访问。AFFiNE 是一个全新的开源项目,旨…

【Hive】——CLI客户端(bin/beeline,bin/hive)

1 HiveServer、HiveServer2 2 bin/hive 、bin/beeline 区别 3 bin/hive 客户端 hive-site.xml 配置远程 MateStore 地址 XML <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet type"text/xsl" hre…

(c语言)计算一个数的每位之和(递归实现)

#include<stdio.h> int DigitSum(int x) {int sum 0, g0;if(x>0){g x % 10;sum g;return sumDigitSum(x/10);}return 0; } int main() {int x;printf("请输入需要计算的数\n");scanf("%d",&x);int yDigitSum(x);printf("%d",y);…

uniapp播放 m3u8格式视频 兼容pc和移动端

支持全自动播放、设置参数 自己摸索出来的,花了一天时间,给点订阅支持下,订阅后,不懂的地方可以私聊我。 代码实现 代码实现 1.安装dplayer组件 npm i dplayer2. static/index.html下引入 hls 引入hls.min.js 可以存放在static项目hls下面<script src="/static…

软件设计师——信息安全(二)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

Linux NAPI ------------- epoll边缘触发模式

Linux处理网络数据包的一般流程 分组到达内核的时间是不可预测的。所有现代的设备驱动程序都使用中断来通知内核有分组到达。 网络驱动程序对特定于设备的中断设置了一个处理例程&#xff0c;因此每当该中断被引发时&#xff08;即分组到达&#xff09;&#xff0c;内核都调用…

指数分布的随机变量

如果连续型随机变量的概率密度满足如下条件&#xff1a; 其中为常数&#xff0c;那么就称服从参数为的指数分布。 指数分布的重要性质---无记忆性&#xff1a;

用友NC word.docx任意文件读取漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数…

解决nuxt3环境中css样式失效的问题

现象: 底部播放器进度条拖动按钮没有了&#xff01; 然后通过chrome开发工具检查html元素的结构&#xff1a; 发现progressbar这个元素是存在的&#xff0c;但是为什么没有显示呢&#xff0c;然后回到代码中&#xff1a; 发现原来是组件的名字写错了&#xff0c;多写了一个字母…

IP地址定位是否是实时位置?

随着互联网的普及和网络技术的发展&#xff0c;人们对于网络信息的需求也越来越高。其中&#xff0c;IP地址定位技术作为网络管理的重要手段之一&#xff0c;被广泛应用于网络设备管理和网络安全等领域。然而&#xff0c;对于IP地址定位是否是实时位置这一问题&#xff0c;我们…

Java刷题篇——合并两个有序数组

1.题目描述 给出一个有序的整数数组A 和有序的整数数组 B&#xff0c;请将数组B合并到数组A中&#xff0c;变成一个有序的升序数组。 数据范围&#xff1a;0 < n,m < 100, |Ai| < 100, |Bi| < 100 注意&#xff1a; 保证 A 数组有足够的空间存放 B 数组的元素&…

SDN之Python编程创建多数据中心网络

文章目录 1.拓扑结构2.具体步骤 1.拓扑结构 通过python编程创建一个包含2台核心交换机、4台汇聚交换机、8台边缘交换机和16台主机的网络拓扑&#xff0c;如图示&#xff1a; 2.具体步骤 首先ctrlaltT&#xff08;或右键&#xff09;打开终端&#xff0c;在/home/shy/minine…