对于前端路由应该都很熟悉了,开发过spa应用的应该都用过,只是很少人去查一下前端路由实现的原理。

前端路由的实现核心问题有两个,一个是改变url不刷新,另一个是监听url变化。主要靠的就是hash和history两个方式。

先看看hash,hash属性是url的锚部分,从#开始的部分,以前很多时候用来页面的锚点导航。hash改变,页面不会刷新。js也提供了hashchange事件用来监听urlhash的变化。

先看个效果:

代码:

<a href="#home">home</a>
<a href="#about">about</a>
<div id="app"></div>window.addEventListener('hashchange', onHashChange);
onHashChange();
function onHashChange() {let router = document.getElementById('app');router.innerText = location.hash;
}

很简单,监听hash变化,然后做相应的操作。有一点要注意,通过浏览器前进后退、a标签、location这几种情况改变 url的hash 都会触发 hashchange 事件。还有,因为刷新hash是不变的,必须立马执行一次方法,一般监听DOMContentLoaded的时候去执行,我这边是直接执行了。

history实现就比较复杂一些,history提供了pushState和replaceState两个api,通过这两个方法改变url不会刷新页面。但是监听url变化的事件popstate,只能是浏览器前进后退。所以我们要通过其他方法实现监听。

效果:

代码:

<a href="/home">home</a>
<a href="/about">about</a>
<div id="app"></div>window.addEventListener('popstate', popState);
var router = document.getElementById('app');
popState();
var aList = document.querySelectorAll('a[href]');
for(let i = 0;i < aList.length;i++){aList[i].addEventListener('click', function (ev) {ev.preventDefault();history.pushState(null, '', aList[i].getAttribute('href'))popState();})
}
function popState() {router.innerText = location.pathname;
}

pushState换成replaceState效果是一样的。这边通过监听a标签的点击事件,然后阻止默认事件实现a标签的路由。

其实前端路由实现的原理很简单,只是要结合不同技术去拓展。

父页面监听iframe路由变化_前端路由原理相关推荐

  1. reactrouter监听路由变化_前端路由三种模式

    hash:任何情况下都可以做前端路由,缺点是SEO不友好(服务器收不到hash,浏览器是不会把#后面的内容发给服务器) history模式:后端将所有前端路由都渲染到同一个页面(不能是404页面),缺 ...

  2. HTML父页面监听子页面关闭并回调方法

    1.方式一:父页面监听 父页面中: //此处省略新窗口的设置参数var win = window.open("url", "name", "featu ...

  3. vue 监听map数组变化_解决vue无法侦听数组及对象属性的变化问题

    一.数组 1.可以监听到的情况 如push.splice.=赋值(array=[1,2,3]) 2.无法监听到的情况 使用下标修改某个元素(这种比较常见) array[index] = 1 objec ...

  4. java监听变量的变化_[Java学习小记]使用PropertyChangeSupport来监听变量的变化

    最近开始要着手写一个web项目 ,之前没怎么 写过Java ,所以觉得蛮有必要把每天学习到的一些知识点或者解决的一些问题给记录下来 .一来供自己在整理过程中掌握巩固,二来也为以后再次出现该问题时能快速 ...

  5. js监听select值变化_网络编程——C++实现socket通信(TCP)高并发之select模式

    相关函数: 服务端: socket() bind() listen() FD_ZERO()等辅助函数 select() 高并发select模式 accept() read() 或 recv()等 wr ...

  6. vue watch 监听不到变化_关于vue中watch检测到不到对象属性的变化的解决方法

    前言 在vue开发的过程中发现一个问题:改变vue.$data中对象的属性,watch是观测不到变化,但其实对象的属性是有变化的.这--,有点难以置信! 正文 update age with 25 e ...

  7. reactrouter监听路由变化_一篇文章搞懂前端路由原理解析和实现方式

    在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂. 想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理 ...

  8. 监听localStorage变化(同页面监听)

    "当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发" 同页面监听,重写localStorage的方法,抛出自定义事件: &l ...

  9. 如何监听URL的变化?

    文章转自: https://juejin.im/post/5c2708cd6fb9a049f06a5744 如何监听URL的变化? 单页应用的原理从早起的根据url的hash变化,到根据H5的hist ...

最新文章

  1. 【数字信号处理】相关函数应用 ( TDOA 时差估计 | 时间差与距离差 | 方向定位与精准定位 | 信号描述 | 通过相关函数求时间差 )
  2. ios 边录音边放_关于Android和iOS系统OneNote支持边录音边记笔记的需求和建议
  3. Android Studio Problems
  4. Python 内置模块之 logging
  5. b700a怎么连蓝牙_小身材有大功能,小米蓝牙耳机AirDots青春版初体验
  6. flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮
  7. linux建模工具有哪些,linux uml 免费 建模工具
  8. pymysql的使用
  9. 00 | 为什么下一个开源项目可能仅是一个接口
  10. Android Manifest配置文件中use-permission相关内容列表
  11. Git之(三)辅助命令
  12. ArcGIS Server manger管理页面无法打开问题解决
  13. 关于jupyter notebook闪退问题【我真真的够了,大家以后不要乱捣鼓电脑了,绝了】
  14. 微信小程序 RangeError: WebAssembly.Memory(): could not allocate memory
  15. 简单的NovelAI绘画方法
  16. 施乐3030工程机驱动安装
  17. 纷享销客《快消行业CRM应用与选型指南》重磅发布
  18. 中国能源建设合并葛洲坝又有最新进展,葛洲坝即将终止上市
  19. 【批量解压d文件】d文件是GNSS观测数据文件
  20. 如果重新学习计算机,你的学习路线是什么?

热门文章

  1. numpy.random 模块- 随机数
  2. PyCharm平台下初学Django框架
  3. oracle数据库月份日期固定,oracle 日期函数介绍-数据库专栏,ORACLE
  4. 2017.9.29 数三角形 思考记录
  5. 2017.9.15 最大数maxnumber 思考记录
  6. java for in 循环_js的for in循环和java里foreach循环的区别分析
  7. 【英语学习】【English L06】U06 Banking L1 How can I save money?
  8. 简述php语言的特点是_PHP语言有哪些优势和特点(一)
  9. 汇编怎么从内存地址写入连续的数字_汇编语言 第一章 基础知识
  10. java抽象方法实例_Java 抽象类和抽象方法实例