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 相关文章推荐
showModalDialog 和 showModelessDialog
Jan 22 Javascript
多个js与css文件的合并方法详细说明
Dec 26 Javascript
页面定时刷新(1秒刷新一次)
Nov 22 Javascript
用js控制组织结构图可以任意拖拽到指定位置
Jan 17 Javascript
收集json解析的四种方法分享
Jan 17 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
Aug 17 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
Dec 14 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
JS实现的排列组合算法示例
Jul 16 Javascript
Js实现复选框的全选、全不选反选功能代码实例
Feb 28 Javascript
Vue管理系统前端之组件拆分封装详解
Aug 23 Javascript
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中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
二级域名转向类
2006/11/09 Javascript
用JavaScript显示随机图像或引用
2009/04/21 Javascript
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
vue实现点击追加选中样式效果
2019/11/01 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python File(文件) 方法整理
2019/02/18 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
pandas中ix的使用详细讲解
2020/03/09 Python
关于python 跨域处理方式详解
2020/03/28 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
旧时光糖果:Old Time Candy
2018/02/05 全球购物
毕业评语大全
2014/05/04 职场文书