一、前言

其实不止一次想监听浏览器的回退方法,比如

在 list.html 页滚动加载了几页列表,点到 detail.html 看详情,反回来时又得重新加载几页

H5 有背景音乐的,跳页就得重新放,体验实在不妙,等等

再其他就是体验上的优化了,虽然可以添加返回按钮,但手机的回退键还是很常用的。

再加上 ajax 的无刷新体验,单页面应用可谓是一大装逼利器。

二、前端路由的好处

(伪)换页面时还可以添加动画,丝滑流畅的操作体验实在不能更棒,另外相较后端路由,前端路由也算是减轻了服务区负荷...

也正基于此,根据不同 url 渲染不同视图这种路由的概念被提上台面,让渲染哪一个可以得到方便的管理。

三、前端路由的坏处

前端路由也是有利有弊,它的不足在于

1. 安全性,改改路由就能跳到某页面,肆意进入不同流程,想想还是有点瘆人的

2. 状态恢复,比如第一页添了表单,跳到第二页再返回,这些表单可能得清空之类的问题

四、实现前端路由

其实路由也就两步,实现 url 变化 & 捕捉变化进行不同的页面逻辑

1. 改变 url

location api 的 reload / replace 方法,修改 href / hash / search 等属性等,

history api 的 back / go 方法,以及比较新的 pushState / replaceState 方法...

改变 url 的方式太多了,

需要注意的是哪些是会刷新页面的,哪些是会改 url 但不刷新页面的...

2. 捕捉 url 变化

主要得靠 window 的事件 hashchange 和 popstate

用 setInterval 持续监听(每 100ms 比较 oldUrl 和 nowUrl)也不是不可以,但你也懂得性能是个好东西

注意:pushState / replaceState 不会触发 popstate 事件,其他是否触发问题你可以继续尝试

3. 简单的实现与封装

易懂的封装:

function Router() {
this.routes = {};
window.addEventListener('load', this.resolve.bind(this), false);
window.addEventListener('hashchange', this.resolve.bind(this), false);
}
Router.prototype.route = function(path, callback) {
this.routes[path] = callback || function(){};
}
Router.prototype.resolve = function() {
this.curHash = location.hash.slice(1) || '/';
typeof this.routes[this.curHash] === 'function' && this.routes[this.curHash]();
}

简单的案例:

<ul>
<li><a href="#blue">蓝色</a></li>
<li><a href="#yellow">黄色</a></li>
</ul>
<ul>
<li><a href="#red">红色</a></li>
</ul>
var router = new Router();
router.route('blue', function(){
document.body.style.background = 'lightblue';
});
router.route('yellow', function(){
document.body.style.background = 'yellow';
});
router.route('red', function(){
document.body.style.background = 'red';
});

DEMO1: https://foreverz133.github.io/demos/single/router.html

DEMO2: https://foreverz133.github.io/demos/single/history.html

五、其他

1. 不是所有页面都需要改变 url,因为它会牵扯到回退

2. 浏览器的回退在体验上对前端是道比较难回答的题,比如回退两页,不返回登录/支付等

3. 在转场之间加上动画,当然要完成这效果就得使用 click 和 transitionEnd 等事件了

4. 状态控制,最便捷(并非最佳)的办法是全局一个对象去保存这些状态,每次进行判断和初始化操作

5. 当然如果你会 ReactJS 等模块化渲染的话,路由还可以更厉害

6. 还要比往常遇到更多优化上的问题,比如资源加载/数据更新/操作流畅度等

7. 梳理逻辑和确定状态,这些前期的事远比书写更重要,不然你会被改死的,讲真!

本文所提路由还太狭隘,毕竟路由是前后端都有的东西,url 也仅仅是指向某资源,所以它还会涵盖处理数据/数据传递等更多方面

六、总结

单页面应用(SPA)对前端的要求成倍增加,对开发者来说其实是好事,

有挑战进度会更快,不过和后端/策划的契合度也要相应提高才行。

前端路由以及浏览器回退,hash & history & location的更多相关文章

  1. 【前端路由】Vue-router 中hash模式和history模式的区别

    咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...

  2. (转)浏览器对象window,history,location,navigator,screen

    1.window对象:当前的浏览器窗口 window对象是BOM的核心,window对象指当前的浏览器窗口 所有JavaScript全局对象.函数以及变量均自动成为window对象的成员 全局变量是w ...

  3. vue开发关于微信授权登录以及路由mode模式(Hash|History)和手机平台(andriod|IOS)不得不说的故事

    引用链接: https://segmentfault.com/a/1190000010753247?utm_source=tuicool&utm_medium=referral

  4. javascript基础修炼(6)——前端路由的基本原理

    [造轮子]是笔者学习和理解一些较复杂的代码结构时的常用方法,它很慢,但是效果却胜过你读十几篇相关的文章.为已知的API方法自行编写实现,遇到自己无法复现的部分再有针对性地去查资料,最后当你再去学习官方 ...

  5. 前端路由原理之 hash 模式和 history 模式

    什么是路由? 个人理解路由就是浏览器 URL 和页面内容的一种映射关系. 比如你看到我这篇博客,博客的链接是一个 URL,而 URL 对应的就是我这篇博客的网页内容,这二者之间的映射关系就是路由. 其 ...

  6. 前端路由两种模式:hash、history

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  7. 前端路由的两种模式: hash 模式和 history 模式

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  8. 前端路由的两种模式:hash(#)模式和history模式(转)

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  9. 前端路由hash、history原理及简单的实践下

    阅读目录 一:什么是路由?前端有哪些路由?他们有哪些特性? 二:如何实现简单的hash路由? 三:如何实现简单的history路由? 四:hash和history路由一起实现 回到顶部 一:什么是路由 ...

随机推荐

  1. nginx配置虚拟主机之不同端口和不同IP地址

    配置nginx虚拟主机不同端口和不同ip地址,和上编nginx基于域名配置虚拟主机博文类似,请先参考. zxl.com域名不同端口,配置文件内容如下: 1 2 3 4 5 6 7 8 9 10 11 ...

  2. DevOps的概念

    DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.它的出现是 ...

  3. img图片不存在时设置默认图片

    当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验.即使使用alt属性给出了"图片XX"的提示信息,也起不了多大作用. 其实,可 ...

  4. Mysql----数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...

  5. myeclipse乱码/GBK只支持中文

    Windows>>Pereferences>>General>Editors>>Spelling>>Encoding选项下选择other,然后输入 ...

  6. easyui datagrid 加载 历险记(dom中已经加载,fit:true 时改变浏览器大小是会显示出来)

    (dom中已经加载,fit:true 时改变浏览器大小是会显示出来) 第一个想到的就是resize datagird  大小!可是没有用 ... 答案是加载的的div height为0导至的(//To ...

  7. CH6101 最优贸易【最短路】

    6101 最优贸易 0x60「图论」例题 描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通 ...

  8. 什么是安全散列算法SHA256?

    安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1.SHA-224.S ...

  9. codeforces 798B - Mike and strings

    感觉自己好咸鱼呀……B题写了这么久,虽然可以算作1A(忽略一次少include一个头文件的CE)…… 思想很简单,每次选定一个字符串作为目标字符串,然后把其他所有字符串都当做测试字符串,计算出总共需要 ...

  10. Windows编程之connect函数研究

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...