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 相关文章推荐
自己开发Dojo的建议框架
Sep 24 Javascript
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
Jan 24 Javascript
浅谈jQuery事件绑定原理
Jan 02 Javascript
详细分析JavaScript变量类型
Jul 08 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
Express的路由详解
Dec 10 Javascript
jQuery使用经验小技巧(推荐)
May 31 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
js封装成插件的步骤方法
Sep 11 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 Javascript
Vue props中Object和Array设置默认值操作
Jul 30 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实现Linux服务器木马排查及加固功能
2014/12/29 PHP
jQuery Clone Bug解决代码
2010/12/22 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
js打造数组转json函数
2015/01/14 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
如何通过python计算圆周率PI
2020/11/11 Python
美国休闲服装品牌:Express
2016/09/24 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
学生处主任岗位职责
2013/12/01 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
个人违纪检讨书
2014/09/15 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书