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 相关文章推荐
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
Sep 15 Javascript
js 立即调用的函数表达式如何写
Jan 12 Javascript
js限制checkbox选中个数以限制六个为例
Jul 15 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
Bootstrap基本样式学习笔记之图片(6)
Dec 07 Javascript
jQuery实现三级联动效果
Mar 02 Javascript
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
使用bootstraptable插件实现表格记录的查询、分页、排序操作
Aug 06 Javascript
30分钟快速实现小程序语音识别功能
Nov 27 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 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实现处理输入转义字符的代码
2015/11/08 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
jquery ajax abort()的使用方法
2010/10/28 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
简介Django中内置的一些中间件
2015/07/24 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
使用python实现飞机大战游戏
2020/03/23 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
土地转让协议书
2014/04/15 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
奖学金感谢信
2015/01/21 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
离婚案件上诉状
2015/05/23 职场文书
python中redis包操作数据库的教程
2022/04/19 Python