Javascript实现前端简单的路由实例


Posted in Javascript onSeptember 11, 2016

前言

前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等。前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体验的目的,越来越多的网站特别是web应用都用到了前端路由。

HTML

页面中有一个导航菜单ul,和一个div#result用来显示结果,当点击导航菜单时,#result中会显示不同的结果内容。

<ul> 
 <li><a href="#/">首页</a></li> 
 <li><a href="#/product">产品</a></li> 
 <li><a href="#/server">服务</a></li> 
</ul>
<div id="result"></div>

JAVASCRIPT

说一下前端路由实现的简要原理,以 hash 形式(也可以使用 History API 来处理)为例,当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不同的操作,进行不同的内容的展示。

function Router(){
 this.routes = {};
 this.curUrl = '';

 this.route = function(path, callback){
  this.routes[path] = callback || function(){};
 };

 this.refresh = function(){
  this.curUrl = location.hash.slice(1) || '/';
  this.routes[this.curUrl]();
 };

 this.init = function(){
  window.addEventListener('load', this.refresh.bind(this), false);
  window.addEventListener('hashchange', this.refresh.bind(this), false);
 }
}

上面代码中路由系统Router对象实现,主要提供三个方法:

     init监听浏览器 url hash 更新事件。

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

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

Router调用方式如下:

点击触发 url 的 hash 改变,并对应地更新内容,运行后你会发现每次点击菜单时,#result中会变换背景色和内容。

var R = new Router();
R.init();
var res = document.getElementById('result');

 R.route('/', function() {
 res.style.background = 'blue';
 res.innerHTML = '这是首页';
 });
 R.route('/product', function() {
  res.style.background = 'orange';
 res.innerHTML = '这是产品页';
 });
 R.route('/server', function() {
  res.style.background = 'black';
 res.innerHTML = '这是服务页';
 });

总结

以上为一个前端路由的简单实现,实际应用中,应该对hash进行正则匹配处理,以满足大量url的应用,同时增加ajax异步请求页面内容等功能。虽然这个实例非常简单,但实际上很多路由系统的根基都立于此,其他路由系统主要是对自身使用的框架机制进行配套及优化。好了,本文的内容到这就结束了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
JavaScript中的apply()方法和call()方法使用介绍
Jul 25 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
Dec 16 Javascript
JQuery中serialize() 序列化
Mar 13 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
May 09 Javascript
手机Web APP如何实现分享多平台功能
Aug 19 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
使用微信SDK自定义分享的方法
Jul 03 Javascript
基于vue实现圆形菜单栏组件
Jul 05 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
Jul 18 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
Jun 02 jQuery
JavaScript中Array的实用操作技巧分享
Sep 11 #Javascript
JS实现六边形3D拖拽翻转效果的方法
Sep 11 #Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 #Javascript
简单分析javascript中的函数
Sep 10 #Javascript
javascript数组常用方法汇总
Sep 10 #Javascript
JavaScript实现输入框与清空按钮联动效果
Sep 09 #Javascript
Three.js快速入门教程
Sep 09 #Javascript
You might like
php中文件上传的安全问题
2006/10/09 PHP
PHP 基本语法格式
2009/12/15 PHP
php类常量的使用详解
2013/06/08 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python常用模块介绍
2014/11/21 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
python将txt文件读取为字典的示例
2018/12/22 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
Python的collections模块真的很好用
2021/03/01 Python
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
专业实习自我鉴定
2013/10/29 职场文书
应聘会计求职信
2014/06/11 职场文书
2014年党员整改措施
2014/10/24 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
alibaba seata服务端具体实现
2022/02/24 Java/Android