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 相关文章推荐
Visual Studio中的jQuery智能提示设置方法
Mar 27 Javascript
js动态在form上插入enctype=multipart/form-data的问题
May 24 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
jquery-file-upload 文件上传带进度条效果
Nov 21 jQuery
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
May 21 Javascript
vue导航栏部分的动态渲染实例
Nov 01 Javascript
js实现AI五子棋人机大战
May 28 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 Javascript
深入理解javascript中的this
Feb 08 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php生成图片缩略图的方法
2015/04/07 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
简述Python中的面向对象编程的概念
2015/04/27 Python
python图像处理之镜像实现方法
2015/05/30 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
辩论赛主持词
2014/03/18 职场文书
小学生环保演讲稿
2014/04/25 职场文书
安全目标责任书
2014/07/22 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
信仰纪录片观后感
2015/06/08 职场文书
运输公司工作总结
2015/08/11 职场文书
小学思品教学反思
2016/02/20 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
Pandas加速代码之避免使用for循环
2021/05/30 Python
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python