Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // mini front end router library
- var Router = {
- routes: [],
- mode: null,
- root: '/',
- config: function (options) {
- this.mode = options && options.mode && options.mode == 'history'
- && !!(history.pushState) ? 'history' : 'hash';
- this.root = options && options.root ? '/' + this.clearSlashes(options.root) + '/' : '/';
- return this;
- },
- getFragment: function () {
- var fragment = '';
- if (this.mode === 'history') {
- fragment = this.clearSlashes(decodeURI(location.pathname + location.search));
- fragment = fragment.replace(/\?(.*)$/, '');
- fragment = this.root != '/' ? fragment.replace(this.root, '') : fragment;
- } else {
- var match = window.location.href.match(/#(.*)$/);
- fragment = match ? match[1] : '';
- }
- return this.clearSlashes(fragment);
- },
- clearSlashes: function (path) {
- return path.toString().replace(/\/$/, '').replace(/^\//, '');
- },
- add: function (re, handler) {
- if (typeof re == 'function') {
- handler = re;
- re = '';
- }
- this.routes.push({ re: re, handler: handler });
- return this;
- },
- remove: function (param) {
- for (var i = 0, r; i < this.routes.length, r = this.routes[i]; i++) {
- if (r.handler === param || r.re.toString() === param.toString()) {
- this.routes.splice(i, 1);
- return this;
- }
- }
- return this;
- },
- flush: function () {
- this.routes = [];
- this.mode = null;
- this.root = '/';
- return this;
- },
- check: function (f) {
- var fragment = f || this.getFragment();
- for (var i = 0; i < this.routes.length; i++) {
- var match = fragment.match(this.routes[i].re);
- if (match) {
- match.shift();
- this.routes[i].handler.apply({}, match);
- return this;
- }
- }
- return this;
- },
- listen: function () {
- var self = this;
- var current = self.getFragment();
- var fn = function () {
- console.log('current', current, 'self.getFragment()', self.getFragment());
- if (current !== self.getFragment()) {
- current = self.getFragment();
- self.check(current);
- }
- }
- clearInterval(this.interval);
- this.interval = setInterval(fn, 50);
- return this;
- },
- navigate: function (path) {
- path = path ? path : '';
- if (this.mode === 'history') {
- history.pushState(null, null, this.root + this.clearSlashes(path));
- } else {
- window.location.href = window.location.href.replace(/#(.*)$/, '') + '#' + path;
- }
- return this;
- }
- }
- Router.config({ mode: 'history' });
- Router
- .add(/about/, function () {
- console.log('about');
- })
- .add(/products\/(.*)\/edit\/(.*)/, function () {
- console.log('products', [...arguments]);
- })
- .add(/hello/, function name() {
- console.log('hello--->');
- })
- .add(function () {
- console.log('default');
- })
- .check('/products/12/edit/22').listen();
- setTimeout(() => {
- Router.navigate('/about');
- }, 2000)
- setTimeout(() => {
- Router.navigate('/products/12/edit/22');
- }, 4000)
- setTimeout(() => {
- Router.navigate('hello');
- }, 6000)
- setTimeout(() => {
- Router.navigate('/');
- }, 8000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement