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

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

相关文章
|
4天前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
4天前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
18 2
|
4天前
|
JSON 前端开发 JavaScript
前端模块打包器的深度解析
【10月更文挑战第13天】前端模块打包器的深度解析
|
4天前
|
存储 前端开发 JavaScript
前端模块化打包工具的深度解析
【10月更文挑战第13天】前端模块化打包工具的深度解析
|
5天前
|
Web App开发 存储 前端开发
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
15 0
|
5天前
|
缓存 前端开发 安全
前端开发者必备:HTTP状态码含义与用途解析,常见错误码产生原因及解决策略
前端开发者必备:HTTP状态码含义与用途解析,常见错误码产生原因及解决策略
32 0
|
5天前
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
13 0
|
10天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
26 0
|
10天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
24 0
|
10天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
20 0

推荐镜像

更多