js实现自定义路由


Posted in Javascript onFebruary 04, 2017

本文实现自定义路由,主要是事件hashchange的使用,然后根据我们的业务需求封装。

首先实现一个router的类,并实例化。

function _router(config){
 this.config = config ? config : {}; 
} 
_router.prototype = {
 event:function(str,callback){
  var events = str.split(' ');
  for (var i in events) window.addEventListener(events[i],callback,false);
 },
init: function() {
 this.event('load hashchange',this.refresh.bind(this));
 return this;
},
refresh: function() {
 this.currentUrl = location.hash.slice(1) || '/';
 this.config[this.currentUrl]();
},
route: function(path,callback){
 this.config[path] = callback || function(){};
}
}
function router (config){
 return new _router(config).init();
}

上边唯一需要注意的是,在使用addEventListener的时候,需要注意bind函数的使用,因为我是踩了坑,这才体会到$.proxy()。

上边使用的时候可以使用两种方法进行注册,但第二种是依赖第一种的。

方法一:

var Router = router({
 '/' : function(){content.style.backgroundColor = 'white';},
 '/1': function(){content.style.backgroundColor = 'blue';},
 '/2': function(){content.style.backgroundColor = 'green';}
})

方法二:

Router.route('/3',function(){ content.style.backgroundColor = 'yellow'; })

完整代码:

<html>
 <head>
  <title></title>
 </head>
 <body>
  <ul>
   <li><a href="#/1">/1: blue</a></li>
   <li><a href="#/2">/2: green</a></li>
   <li><a href="#/3">/3: yellow</a></li>
  </ul>
  <script>
  var content = document.querySelector('body');
  function _router(config){
   this.config = config ? config : {}; 
  } 
  _router.prototype = {
   event:function(str,callback){
    var events = str.split(' ');
    for (var i in events) window.addEventListener(events[i],callback,false);
   },
   init: function() {
    this.event('load hashchange',this.refresh.bind(this));
    return this;
   },
   refresh: function() {
    this.currentUrl = location.hash.slice(1) || '/';
    this.config[this.currentUrl]();
   },
   route: function(path,callback){
    this.config[path] = callback || function(){};
   }
  }
  function router (config){
   return new _router(config).init();
  }
  var Router = router({
   '/' : function(){content.style.backgroundColor = 'white';},
   '/1': function(){content.style.backgroundColor = 'blue';},
   '/2': function(){content.style.backgroundColor = 'green';}
  })
  Router.route('/3',function(){
   content.style.backgroundColor = 'yellow';
  })
  </script>
 </body>
</html>
<script> 
</script>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript实现的网页局布刷新效果
Dec 01 Javascript
Javascript实现视频轮播在pc端与移动端均可
Sep 29 Javascript
JavaScript输出当前时间Unix时间戳的方法
Apr 06 Javascript
JS去除字符串中空格的方法
Feb 14 Javascript
js实现模糊匹配功能
Feb 15 Javascript
vue环境搭建简单教程
Nov 07 Javascript
通过一个简单的例子学会vuex与模块化
Nov 22 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
May 06 Javascript
详解在vue-test-utils中mock全局对象
Nov 07 Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
详解JavaScript中的函数、对象
Apr 01 Javascript
vue数据响应式原理知识点总结
Feb 16 Javascript
jQuery窗口拖动功能的实现代码
Feb 04 #Javascript
简单易懂的天气插件(代码分享)
Feb 04 #Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 #Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 #Javascript
javascript实现复选框全选或反选
Feb 04 #Javascript
JavaScript获取当前时间向前推三个月的方法示例
Feb 04 #Javascript
javascript表单正则应用
Feb 04 #Javascript
You might like
php的memcached客户端memcached
2011/06/14 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
bootstrap table实例详解
2017/01/06 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
举例详解Python中的split()函数的使用方法
2015/04/07 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
Python中常用的内置方法
2019/01/28 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Python用Jira库来操作Jira
2020/12/28 Python
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
党员公开承诺事项
2014/03/25 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
顶岗实习协议书
2015/01/29 职场文书