前端路由解析(一) —— hash路由

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 前端路由解析(一) —— hash路由

640.jpg

写在前面


现在的前端应用很多都是单页应用。路由对于单页应用来说,是一个重要的组成部分。本系列文章将讲解前端路由的实现原理。这是系列文章的第一篇:hash路由。


hash


首先来说一说什么是hash。我们经常能看到这种url:


1、https://www.baidu.com/#1232、https://www.baidu.com/#234


url后面的#/123,就是hash值,可以通过下面的代码来获取:


window.location.hash// #123// #234


hash最初是用来进行页面快速定位的,当页面很长的时候,是很有用的,比如下面的例子:


<header>  <a href='#p1'>前往段落1</a>  <a href='#p2'>前往段落2</a>  <a href='#p3'>前往段落3</a></header><main>  <p id='p1'>11111111111111111111111111</p>  <p id='p2'>22222222222222222222222222</p>  <p id='p3'>33333333333333333333333333</p></main>


假设我们的三个</p>上下间距很大,点击最上面的</a>标签,可以迅速定位到对应的段落。像下面这样:


640.gif

我们也可以用过代码来控制hash值,同样可以达到定位的效果,比如:


window.location.hash = '#p2'


hash路由


当页面的hash值变化时,是可以监听到的:


window.addEventListener('hashchange', e => {    console.log(e); // HashChangeEvent     const oldUrl = e.oldURL; // 旧的页面地址    const newUrl = e.newURL; // 新的页面地址    const type = e.type // hashchange - 事件类型    const cancelable = e.cancelable; // false - 表示该事件无法取消。即无法通过e.preventDefault()阻止hash跳转});


hash路由就是利用了hash值变化可监听这一点来实现的。我们来实现一个最最简单的:


<body>    <header>        <a href='#p1'>前往段落1</a>        <a href='#p2'>前往段落2</a>        <a href='#p3'>前往段落3</a>    </header>    <main>        <div id="content">            这是首页        </div>    </main>    <script>        const routerMap = {            'p1': () => { document.getElementById('content').innerHTML = '这是段落1的内容' },            'p2': () => { document.getElementById('content').innerHTML = '这是段落2的内容' },            'p3': () => { document.getElementById('content').innerHTML = '这是段落3的内容' },        }        const handleRouter = e => {            const newURL = e && e.newURL || window.location.href;            const newHash = newURL.split('#').pop();            typeof routerMap[newHash] === 'function' && routerMap[newHash]();        };        window.addEventListener('hashchange', handleRouter);        window.addEventListener('load', handleRouter);</script></body>


最终的效果如下图所示:

640.gif



hash路由的兼容性很不错,可以兼容到IE8。并且,hash路由完全由前端就可以实现。


写在后面


本文解析了前端的hash,以及hash路由的实现原理,符合预期。其实很多看起来强大的功能,底层的原理其实很简单。后续会解析另一种常用的路由方式:history路由。


另外,一些我们平时不常用的api等,或许可以做很多事情。比如我之前这篇文章里讲的:


你可能不知道的LocalStorage用法

相关文章
|
23天前
|
移动开发 缓存 前端开发
深入理解前端路由:原理、实现与应用
本书《深入理解前端路由:原理、实现与应用》全面解析了前端路由的核心概念、工作原理及其实现方法,结合实际案例探讨了其在现代Web应用中的广泛应用,适合前端开发者和相关技术人员阅读。
|
29天前
|
负载均衡 网络协议 定位技术
在数字化时代,利用DNS实现地理位置路由成为提升用户体验的有效策略
在数字化时代,利用DNS实现地理位置路由成为提升用户体验的有效策略。通过解析用户请求的来源IP地址,DNS服务器可判断其地理位置,并返回最近或最合适的服务器IP,从而优化网络路由,减少延迟,提高访问速度。示例代码展示了如何基于IP地址判断地理位置并分配相应服务器IP,实际应用中需结合专业地理数据库和动态调整机制,以应对复杂网络环境带来的挑战。
31 6
|
1月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
73 1
|
1月前
|
机器学习/深度学习 编解码 前端开发
探索无界:前端开发中的响应式设计深度解析####
【10月更文挑战第29天】 在当今数字化时代,用户体验的优化已成为网站与应用成功的关键。本文旨在深入探讨响应式设计的核心理念、技术实现及最佳实践,揭示其如何颠覆传统布局限制,实现跨设备无缝对接,从而提升用户满意度和访问量。通过剖析响应式设计的精髓,我们将一同见证其在现代Web开发中的重要地位与未来趋势。 ####
46 7
|
1月前
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
64 4
|
1月前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
66 1
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
40 1
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
78 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
64 0

推荐镜像

更多