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 相关文章推荐
javascript获取url上某个参数的方法
Nov 08 Javascript
基于JS实现textarea中获取动态剩余字数的方法
May 25 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
Jan 05 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
Jan 13 Javascript
javascript容错处理代码(屏蔽js错误)
Jan 20 Javascript
原生JS实现前端本地文件上传
Sep 08 Javascript
解决vue 单文件组件中样式加载问题
Apr 24 Javascript
详解一个小实例理解js原型和继承
Apr 24 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
Nov 14 Javascript
html中创建并调用vue组件的几种方法汇总
Nov 17 Javascript
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
JavaScript实现打字游戏
Feb 19 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在服务器执行exec命令失败的解决方法
2012/03/03 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
PHP处理会话函数大总结
2015/08/05 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
Python3生成手写体数字方法
2018/01/30 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
python装饰器使用实例详解
2019/12/14 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
C语言笔试集
2012/07/24 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
建筑专业自荐信范文
2014/01/05 职场文书
偷看我的初中毕业鉴定
2014/01/29 职场文书
会计岗位职责模板
2014/03/12 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
物流业务员岗位职责
2015/04/03 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python