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 相关文章推荐
jQuery 连续列表实现代码
Dec 21 Javascript
心扬JS分页函数代码
Sep 10 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
Jun 09 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
JavaScript获得指定对象大小的方法
Jul 01 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
js实现用户输入的小写字母自动转大写字母的方法
Jan 21 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
Vue切换Tab动态渲染组件的操作
Sep 21 Javascript
Vue-router中hash模式与history模式的区别详解
Dec 15 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
cmd下运行php脚本
2008/11/25 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
2012/07/01 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Python生成数字图片代码分享
2017/10/31 Python
Python深度优先算法生成迷宫
2018/01/22 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Python读写文件基础知识点
2019/06/10 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
坚定理想信念心得体会
2014/03/11 职场文书
教学评估实施方案
2014/03/16 职场文书
办理收楼委托书范本
2014/10/09 职场文书
证婚人致辞精选
2015/07/28 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python