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 相关文章推荐
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
关于jquery的多个选择器的使用示例
Oct 18 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
Jquery自定义button按钮的几种方法
Jun 11 Javascript
javascript里使用php代码实例
Dec 13 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
Dec 08 Javascript
webpack分离css单独打包的方法
Jun 12 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
小程序如何使用分包加载的实现方法
May 22 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
Jul 20 Javascript
vue3+typescript实现图片懒加载插件
Oct 26 Javascript
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
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
下载给定网页上图片的方法
2014/02/18 Python
python获得一个月有多少天的方法
2015/06/04 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
python和shell获取文本内容的方法
2018/06/05 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
详解HTML5表单新增属性
2016/12/21 HTML / CSS
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
师范生自我鉴定范文
2013/10/05 职场文书
部队领导证婚词
2014/01/12 职场文书
消防安全责任书范本
2014/04/15 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
中学社团活动总结
2015/05/07 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书