JS实现前端路由功能示例【原生路由】


Posted in Javascript onMay 29, 2020

本文实例讲述了JS实现前端路由功能。分享给大家供大家参考,具体如下:

路由就是根据不同的 url 地址展示不同的内容或页面,早期路由的概念是在后端出现的,通过服务器端渲染后返回页面,随着页面越来越复杂,服务器端压力越来越大。后来ajax异步刷新的出现使得前端也可以对url进行管理,此时,前端路由就出现了。

单页面就是有前端路由来实现的,也就是说网站只有一个页面,点击导航会显示不同的内容,对应的url也在发生改变。在这个过程中,js会实时检测url的变化,从而改变显示的内容。

JS实现前端路由功能示例【原生路由】

路由实现的原理:window绑定了监听函数,当url的hash值发生变化的时候会触发hashchange回调,在回调中进行不同的操作,马上刷新页面,从而显示不同的页面。

下面是一个前端路由的简单实现:通过路由实现url的切换、页面内容的改变。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>前端路由测试</title>
  <script src="https://www.jq22.com/jquery/jquery-3.3.1.js"></script>
 
  <style>
      *{
        margin:0;
        padding: 0;
      }

      .content{
        width: 500px;
        height: 300px;
        margin-top: 30px;
        margin:20px auto 0;
      }

      #click_btn{
        width: 500px;
        height: 50px;
        margin:100px auto 0;
      }

      #click_btn a{
        display: block;
        background: #333;
        color: #fff;
        text-decoration: none;
        line-height: 50px;
        text-align: center;
        float: left;
        margin-right: 15px;
        padding: 0px 15px;
      }

      #click_btn a:hover{
        background: #666;
      }
  </style>
 
</head>
<body>
<div id="click_btn">
  <a href="#/one" rel="external nofollow" >第一个页面</a>
  <a href="#/two" rel="external nofollow" >第二个页面</a>
  <a href="#/three" rel="external nofollow" >第三个页面</a>
</div>

<div class="content"></div>
 
<script src="router.js"></script>
<script src="test.js"></script>
 
</body>
</html>

router.js

//构造函数
function Router() {
  this.routes = {};
  this.currentUrl = '';
}
Router.prototype.route = function(path, callback) {
  this.routes[path] = callback || function(){};//给不同的hash设置不同的回调函数
};
Router.prototype.refresh = function() {
  console.log(location.hash.slice(1));//获取到相应的hash值
  this.currentUrl = location.hash.slice(1) || '/';//如果存在hash值则获取到,否则设置hash值为/
  // console.log(this.currentUrl);
  if(this.currentUrl&&this.currentUrl!='/'){
    this.routes[this.currentUrl]();//根据当前的hash值来调用相对应的回调函数
  }
 
};
Router.prototype.init = function() {
  window.addEventListener('load', this.refresh.bind(this), false);
  window.addEventListener('hashchange', this.refresh.bind(this), false);
}
//给window对象挂载属性
window.Router = new Router();
window.Router.init();

test.js

Router.route('/one', function () {
  $(".content").html("<p>路由就是根据不同的 url 地址展示不同的内容或页面,早期路由的概念是在后端出现的,通过服务器端渲染后返回页面,随着页面越来越复杂,服务器端压力越来越大。后来ajax异步刷新的出现使得前端也可以对url进行管理,此时,前端路由就出现了。</p>");
});
Router.route('/two', function () {
  $(".content").html("<h3>单页面就是有前端路由来实现的,也就是说网站只有一个页面,点击导航会显示不同的内容,对应的url也在发生改变。在这个过程中,js会实时检测url的变化,从而改变显示的内容。</h3>");
});
Router.route('/three', function () {
  $(".content").html("<img src='https://upload-images.jianshu.io/upload_images/12890819-f8665293cc8d0dcf.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp' width='500'/>");
});

注意:router.js要在test.js之前进行调用,不然会先加载test.js从而找不到,出现router.js未被定义。

上面router对象实现主要提供了三个方法

1.init监听浏览器url的hash值更新事件。

2.route存储路由更新时的回调到回调数组routes中,回掉函数将负责对页面进行更新。

3.refresh执行当前url的回调函数,更新页面。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript切换特效与技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
Juery解决tablesorter中文排序和字符范围的方法
May 06 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
使用JavaScript实现链表的数据结构的代码
Aug 02 Javascript
Vue精简版风格指南(推荐)
Jan 30 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
JavaScript实现轮播图效果代码实例
Sep 28 Javascript
JavaScript对象字面量和构造函数原理与用法详解
Apr 18 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
Oct 09 Javascript
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
JavaScript如何实现图片处理与合成
May 29 #Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
May 29 #jQuery
JavaScript基于用户照片姓名生成海报
May 29 #Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
May 29 #Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 #Javascript
JavaScript隐式类型转换代码实例
May 29 #Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
May 28 #Javascript
You might like
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
VueJS全面解析
2016/11/10 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
分享Python文本生成二维码实例
2016/01/06 Python
python opencv读mp4视频的实例
2018/12/07 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
Python for i in range ()用法详解
2020/09/18 Python
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
xxx同志考察材料
2014/02/07 职场文书
员工合理化建议书
2014/05/19 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
导游词之湖北武当山
2019/09/23 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis