js map 只输出key_原生js实现简单路由切换

2e22abdc6a85dab62af3663ef2ef0d25.png

前言:现在前端技术火热,各种前端框架更是层出不穷。在过去,路由切换只出现在后台里,前台想要切换到某个页面,需要向后端请求,随后后端完成路由切换。但是随着SPA单页面应用程序的发展,前端路由也逐渐火热。单页面应用顾名思义就是网页只有一个HTML,但是当我们点击导航的时候,页面url会改变,网页也会显示不同的内容,这就是前端路由所做的事。其实总的来说就是一句话:js监测url的变化,从而改变显示内容

欢迎关注微信公众号:前端切图仔

其他文章参考:

天之蓝源:三分钟在GitHub上搭建个人博客​zhuanlan.zhihu.com
3da8fc5b4ea4b4844822692fee82d061.png
天之蓝源:零基础Hexo+Github搭建静态个人博客​zhuanlan.zhihu.com
eea82dbdfc74399878df459ff6d3eac5.png
天之蓝源:原生js实现点击按钮复制文本内容​zhuanlan.zhihu.com
aa35942fdf8c236913d07d4dc49cc16f.png
天之蓝源:九种跨域方式实现原理​zhuanlan.zhihu.com
7351ee925d330fe32160403fe8e726cc.png
天之蓝源:前端面试考点多?看这些文章就够了(转载)​zhuanlan.zhihu.com
c4893217cedfb48b66dc0955570e1d42.png
天之蓝源:干货!值得收藏的前端学习网站​zhuanlan.zhihu.com
cdd4864812330a40247cc353be1d325f.png
天之蓝源:原生JS实现一个日期选择器(DatePicker)组件​zhuanlan.zhihu.com
20e5632d59b43e14f529db83d1aa5f59.png
天之蓝源:原生js一步一步实现《别踩白块儿》小游戏​zhuanlan.zhihu.com
a52054b3bc800c320609cc9d5036bdee.png
天之蓝源:原生js利用localstorage实现简易TODO list应用​zhuanlan.zhihu.com
4e3a8e4df65d8a1074b28f0b9e27872c.png
天之蓝源:原生js实现瀑布流效果​zhuanlan.zhihu.com
74a0258d6f66f628eea90d70e622b887.png
天之蓝源:原生js实现图片懒加载(lazyLoad)​zhuanlan.zhihu.com
07c816354d0ac888ab9b2b5d3ada16c4.png
天之蓝源:原生js实现简单路由切换​zhuanlan.zhihu.com
da37112ca1029db074156f1d99bb934b.png

一.本篇文章要实现的效果

d2eb08b9b2bcd07c916b5835c7d90382.png
js实现的简单前端路由https://www.zhihu.com/video/1067148067286851584

二.实现思路

利用<a>标签进行url的切换,然后js代码监测url的变化,从而改变特定区域的显示内容。

注意:<a>标签的href必须以“#”开头,如:<a href="#/....">。因为有“#”,页面则不会向服务器请求资源,则不会刷新页面。这也就是单页面应用程序路由切换的原理。

三.页面结构---->HTML

这个页面结构是很常见的一种网站布局方式:采用头部和底部固定,中间左侧为菜单栏,右侧为内容显示区。

<

四.来点样式---->CSS

页面结构是出来了,但是没有样式就如同行尸走肉一般,我们来为它添加一点样式:

* 

此时的页面大致如此:

f3a3756a85eb8c8583e53a358b0e0ca8.png
页面结构

五.js路由切换函数封装---->JavaScript

现在是最重要的js代码了,我们最开始提到实现前端路由的这种方式就是监测浏览器url的变化,其实就是监测“#”后面的变化值。在浏览器中,每个url就是hash值,所以实际上我们监测的是url的hash值变化,所以这种路由方式也被称作hash路由。

这里的js实现代码我们把它分为几大部分:

  1. 设置一个自执行函数,保证代码不被污染。
  2. 在自执行函数里面添加一个构造函数。
  3. 在构造函数的原型对象上添加一些函数。
  4. 利用window.object = function() 将函数暴露出去。

大致步骤说了,下面我们就来实现我们的代码,在代码里面我们再来慢慢体会。

先来实现我们的自执行函数:

(

接下来就是编写对应url应该对应什么内容的js代码了

(function(){
    var Router = function () {
        this.routes = {};//保存路由
        this.curUrl = '';//获取当前的hash值
    }
    Router.prototype.init = function () {
        //hashchange事件,当hash变化时,调用reloadPage方法
        //第一个this指向window,bind里面的this指向调用这个函数的对象,具体使用方法可以百度
        window.addEventListener('hashchange', this.reloadPage.bind(this));
    }

    Router.prototype.reloadPage = function () {
        this.curUrl = location.hash.substring(1) || '/';//获取当前hash的值(去掉#)
        this.routes[this.curUrl]();      //运行当前hsah值对应的函数
    }

    Router.prototype.map = function( key, callback ){ //保存路由对应的函数:
        this.routes[key] = callback;  //key表示hash的值(去掉#),callback表示当前hash对应的函数
    } 
    window.oRou = Router;
})()


var oRouter2 = new oRou();
oRouter2.init();
oRouter2.map('/',function () {
    var oSidebar = document.querySelector("sidebar");
    oSidebar.innerHTML = '我是主页';
})

oRouter2.map('/html',function () {
    var oSidebar = document.querySelector("sidebar");
    oSidebar.innerHTML = '我是html页面';
})

oRouter2.map('/css',function () {
    var oSidebar = document.querySelector("sidebar");
    oSidebar.innerHTML = '我是css页面';
})

oRouter2.map('/javascript',function () {
    var oSidebar = document.querySelector("sidebar");
    oSidebar.innerHTML = '我是javascript页面';
})

六.总结

到这里我们想要的效果已经基本实现了,回顾所有代码,其实很简单。我大概梳理一下实现思路:

  1. 实现的效果:左侧侧边栏,右侧显示区域,实现点击左侧侧边栏,只有右边内容区域改变,而不刷新整个页面。
  2. 实现的原理:利用a标签改变url的特性,通过监听路由hash值得改变来执行相应的函数。
  3. 实现一个自执行函数,函数里面初始化几个方法。

第一初始化一个‘hashchange’事件函数,用来监听路由的变化。

第二设置一个改变页面函数(reloadPage ),不同的url执行不同的函数。

第三设置map函数,给不同的url赋予不同的函数。

-------------------------------分割线---------------------------------------------------------

到这里就结束了,具体实现代码是笔者参考网上大牛们和自己思考所写下的,欢迎大家指点。

源代码地址:

Hacker233/JavaScript​github.com
52fab5a58c61f4af914b9fd4e752e2e4.png
微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip微信小程序全套源代码(后台、小程序php)(源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值