(function () { window.Router = function () { var self = this; self.hashList = {}; /* 路由表 */ self.index = null; self.key = '!'; window.onhashchange = function () { self.reload(); }; }; /** * 添加路由,如果路由已经存在则会覆盖 * @param addr: 地址 * @param callback: 回调函数,调用回调函数的时候同时也会传入相应参数 */ Router.prototype.add = function (addr, callback) { var self = this; self.hashList[addr] = callback; }; /** * 删除路由 * @param addr: 地址 */ Router.prototype.remove = function (addr) { var self = this; delete self.hashList[addr]; }; /** * 设置主页地址 * @param index: 主页地址 */ Router.prototype.setIndex = function (index) { var self = this; self.index = index; }; /** * 跳转到指定地址 * @param addr: 地址值 */ Router.prototype.go = function (addr) { var self = this; window.location.hash = '#' + self.key + addr; }; /** * 重载页面 */ Router.prototype.reload = function () { var self = this; var hash = window.location.hash.replace('#' + self.key, ''); //var addr = hash.split('/')[0]; var addr = hash; var cb = getCb(addr, self.hashList); if (cb != false) { var arr = hash.split('/'); arr.shift(); cb.apply(self, arr); } else { self.index && self.go(self.index); } }; /** * 开始路由,实际上只是为了当直接访问路由路由地址的时候能够及时调用回调 */ Router.prototype.start = function () { var self = this; self.reload(); } /** * 获取callback * @return false or callback */ function getCb(addr, hashList) { for (var key in hashList) { if (key == addr) { return hashList[key] } } return false; } })();