| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198 | 9×
1×
873×
873×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
860×
860×
1×
11×
11×
11×
11×
1×
1×
1×
873×
873×
873×
873×
873×
873×
1×
872×
1×
860×
11×
11×
11×
11×
11×
11×
11×
11×
11×
11×
11×
11×
11×
11×
11×
13×
1×
1×
1×
1×
1×
| var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { Iif (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { Iif (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
Eif (typeof define !== 'function') {
var define = require('amdefine')(module);
}
define(function (require) {
'use strict';
var util = require('./util');
var canUseDOM = require('./ExecutionEnvironment').canUseDOM;
var EventTarget = require('fc-mini-event/EventTarget');
var config = require('./config');
var events = require('./events');
var getLocation = function getLocation() {
// Firefox下`location.hash`存在自动解码的情况,
// 比如hash的值是**abc%3def**,
// 在Firefox下获取会成为**abc=def**
// 为了避免这一情况,需要从`location.href`中分解
var index = global.location.href.indexOf('#');
var urlHash = index === -1 ? '' : global.location.href.slice(index);
return urlHash;
};
var forwardHash = function forwardHash(locator) {
var urlHash = getLocation();
locator.redirect(urlHash);
};
var _start = function _start(locator, firstTime) {
Eif (!canUseDOM) {
return;
}
if (locator.handler == null) {
locator.handler = util.bind(forwardHash, null, locator);
}
var handler = locator.handler;
if (global.addEventListener) {
global.addEventListener('hashchange', handler, false);
} else if ('onhashchange' in global && global.document && global.document.documentMode > 7) {
global.attachEvent('onhashchange', handler);
} else {
locator.rollTimer = setInterval(handler, 100);
}
if (firstTime) {
locator.startupTimer = setTimeout(handler, 0);
}
};
var updateURL = function updateURL(locator, urlHash, options) {
var changed = locator.currentLocation !== urlHash;
// 存储当前信息
//
// Opera下,相同的hash重复写入会在历史堆栈中重复记录,
// 需要再行与当前的hash比较
Iif (canUseDOM && changed && getLocation() !== urlHash) {
if (options.slient) {
locator.stop();
global.location.hash = urlHash;
_start(locator, false);
} else {
global.location.hash = urlHash;
}
}
locator.currentLocation = urlHash;
return changed;
};
var Locator = function (_EventTarget) {
_inherits(Locator, _EventTarget);
function Locator() {
_classCallCheck(this, Locator);
var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Locator).call(this));
_this.currentLocation = '';
_this.rollTimer = 0;
_this.startupTimer = 1;
return _this;
}
_createClass(Locator, [{
key: 'setErContext',
value: function setErContext(erContext) {
this.erContext = erContext;
}
}, {
key: 'getErContext',
value: function getErContext() {
return this.erContext;
}
}, {
key: 'start',
value: function start() {
_start(this, true);
}
}, {
key: 'stop',
value: function stop() {
if (!canUseDOM) {
return;
}
if (this.rollTimer) {
clearInterval(this.rollTimer);
this.rollTimer = null;
}
if (this.startupTimer) {
clearTimeout(this.startupTimer);
this.startupTimer = null;
}
if (global.removeEventListener) {
global.removeEventListener('hashchange', this.handler, false);
} else if ('onhashchange' in global && global.document && global.document.documentMode > 7) {
global.detachEvent('onhashchange', this.handler);
}
}
}, {
key: 'resolveURL',
value: function resolveURL(urlHash) {
urlHash = urlHash + '';
Iif (urlHash.indexOf('#') === 0) {
urlHash = urlHash.slice(1);
}
Iif (!urlHash || urlHash === '/') {
urlHash = config.indexURL;
}
return urlHash;
}
}, {
key: 'redirect',
value: function redirect(urlHash, options) {
options = options || {};
urlHash = this.resolveURL(urlHash);
var referrer = this.currentLocation;
var isLocationChanged = updateURL(this, urlHash, options);
var shouldPerformRedirect = isLocationChanged || options.force;
Eif (shouldPerformRedirect) {
Eif (!options.silent) {
this.fire('redirect', { url: urlHash, referrer: referrer });
}
var eventBus = this.getEventBus();
eventBus && eventBus.fire('redirect', { url: urlHash, referrer: referrer });
}
return shouldPerformRedirect;
}
}, {
key: 'reload',
value: function reload() {
if (this.currentLocation) {
this.redirect(this.currentLocation, { force: true });
}
}
}, {
key: 'getEventBus',
value: function getEventBus() {
return this.erContext && this.erContext.getEventBus();
}
}, {
key: 'setEventBus',
value: function setEventBus(eventBus) {
this.erContext && this.erContext.setEventBus(eventBus);
}
}]);
return Locator;
}(EventTarget);
var instance = new Locator();
instance.Locator = Locator;
return instance;
});
//# sourceMappingURL=data:application/json;base64,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QUFsQixDQURrQjs7Ozs7TUF2RkosYUF6RUE7O0FBcUt0QixRQUFNLFdBQVcsSUFBSSxPQUFKLEVBQVgsQ0FyS2dCO0FBc0t0QixhQUFTLE9BQVQsR0FBbUIsT0FBbkIsQ0F0S3NCOztBQXdLdEIsV0FBTyxRQUFQLENBeEtzQjtDQUFuQixDQUFQIiwiZmlsZSI6ImxvY2F0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpZiAodHlwZW9mIGRlZmluZSAhPT0gJ2Z1bmN0aW9uJykge3ZhciBkZWZpbmUgPSByZXF1aXJlKCdhbWRlZmluZScpKG1vZHVsZSl9XG5cbmRlZmluZShmdW5jdGlvbiAocmVxdWlyZSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbiAgICBjb25zdCBjYW5Vc2VET00gPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50JykuY2FuVXNlRE9NO1xuICAgIGNvbnN0IEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnZmMtbWluaS1ldmVudC9FdmVudFRhcmdldCcpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG4gICAgY29uc3QgZXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcblxuXG4gICAgY29uc3QgZ2V0TG9jYXRpb24gPSAoKSA9PiB7XG4gICAgICAgIC8vIEZpcmVmb3jkuItgbG9jYXRpb24uaGFzaGDlrZjlnKjoh6rliqjop6PnoIHnmoTmg4XlhrXvvIxcbiAgICAgICAgLy8g5q+U5aaCaGFzaOeahOWAvOaYryoqYWJjJTNkZWYqKu+8jFxuICAgICAgICAvLyDlnKhGaXJlZm945LiL6I635Y+W5Lya5oiQ5Li6KiphYmM9ZGVmKipcbiAgICAgICAgLy8g5Li65LqG6YG/5YWN6L+Z5LiA5oOF5Ya177yM6ZyA6KaB5LuOYGxvY2F0aW9uLmhyZWZg5Lit5YiG6KejXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWYuaW5kZXhPZignIycpO1xuICAgICAgICBjb25zdCB1cmxIYXNoID0gaW5kZXggPT09IC0xID8gJycgOiBnbG9iYWwubG9jYXRpb24uaHJlZi5zbGljZShpbmRleCk7XG5cbiAgICAgICAgcmV0dXJuIHVybEhhc2g7XG4gICAgfTtcblxuICAgIGNvbnN0IGZvcndhcmRIYXNoID0gKGxvY2F0b3IpID0+IHtcbiAgICAgICAgY29uc3QgdXJsSGFzaCA9IGdldExvY2F0aW9uKCk7XG4gICAgICAgIGxvY2F0b3IucmVkaXJlY3QodXJsSGFzaCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gKGxvY2F0b3IsIGZpcnN0VGltZSkgPT4ge1xuICAgICAgICBpZiAoIWNhblVzZURPTSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvY2F0b3IuaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2NhdG9yLmhhbmRsZXIgPSB1dGlsLmJpbmQoZm9yd2FyZEhhc2gsIG51bGwsIGxvY2F0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBsb2NhdG9yLmhhbmRsZXI7XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgnb25oYXNoY2hhbmdlJyBpbiBnbG9iYWwgJiYgZ2xvYmFsLmRvY3VtZW50ICYmIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudE1vZGUgPiA3KSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoJ29uaGFzaGNoYW5nZScsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9jYXRvci5yb2xsVGltZXIgPSBzZXRJbnRlcnZhbChoYW5kbGVyLCAxMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgbG9jYXRvci5zdGFydHVwVGltZXIgPSBzZXRUaW1lb3V0KGhhbmRsZXIsIDApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZVVSTCA9IChsb2NhdG9yLCB1cmxIYXNoLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBsb2NhdG9yLmN1cnJlbnRMb2NhdGlvbiAhPT0gdXJsSGFzaDtcblxuICAgICAgICAvLyDlrZjlgqjlvZPliY3kv6Hmga9cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT3BlcmHkuIvvvIznm7jlkIznmoRoYXNo6YeN5aSN5YaZ5YWl5Lya5Zyo5Y6G5Y+y5aCG5qCI5Lit6YeN5aSN6K6w5b2V77yMXG4gICAgICAgIC8vIOmcgOimgeWGjeihjOS4juW9k+WJjeeahGhhc2jmr5TovoNcbiAgICAgICAgaWYgKGNhblVzZURPTSAmJiBjaGFuZ2VkICYmIGdldExvY2F0aW9uKCkgIT09IHVybEhhc2gpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNsaWVudCkge1xuICAgICAgICAgICAgICAgIGxvY2F0b3Iuc3RvcCgpO1xuICAgICAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5oYXNoID0gdXJsSGFzaDtcbiAgICAgICAgICAgICAgICBzdGFydChsb2NhdG9yLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbG9iYWwubG9jYXRpb24uaGFzaCA9IHVybEhhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhdG9yLmN1cnJlbnRMb2NhdGlvbiA9IHVybEhhc2g7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH07XG5cbiAgICBjbGFzcyBMb2NhdG9yIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gJyc7XG4gICAgICAgICAgICB0aGlzLnJvbGxUaW1lciA9IDA7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0dXBUaW1lciA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRFckNvbnRleHQoZXJDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmVyQ29udGV4dCA9IGVyQ29udGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldEVyQ29udGV4dCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVyQ29udGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0KCkge1xuICAgICAgICAgICAgc3RhcnQodGhpcywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wKCkge1xuICAgICAgICAgICAgaWYgKCFjYW5Vc2VET00pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGxUaW1lcikge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yb2xsVGltZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9sbFRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnR1cFRpbWVyKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3RhcnR1cFRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0dXBUaW1lciA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnbG9iYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGdsb2JhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5oYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgnb25oYXNoY2hhbmdlJyBpbiBnbG9iYWwgJiYgZ2xvYmFsLmRvY3VtZW50ICYmIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudE1vZGUgPiA3KSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsLmRldGFjaEV2ZW50KCdvbmhhc2hjaGFuZ2UnLCB0aGlzLmhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZVVSTCh1cmxIYXNoKSB7XG4gICAgICAgICAgICB1cmxIYXNoID0gdXJsSGFzaCArICcnO1xuXG4gICAgICAgICAgICBpZiAodXJsSGFzaC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICB1cmxIYXNoID0gdXJsSGFzaC5zbGljZSgxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF1cmxIYXNoIHx8IHVybEhhc2ggPT09ICcvJykge1xuICAgICAgICAgICAgICAgIHVybEhhc2ggPSBjb25maWcuaW5kZXhVUkw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxIYXNoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVkaXJlY3QodXJsSGFzaCwgb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICB1cmxIYXNoID0gdGhpcy5yZXNvbHZlVVJMKHVybEhhc2gpO1xuXG4gICAgICAgICAgICBjb25zdCByZWZlcnJlciA9IHRoaXMuY3VycmVudExvY2F0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNMb2NhdGlvbkNoYW5nZWQgPSB1cGRhdGVVUkwodGhpcywgdXJsSGFzaCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRQZXJmb3JtUmVkaXJlY3QgPSBpc0xvY2F0aW9uQ2hhbmdlZCB8fCBvcHRpb25zLmZvcmNlO1xuICAgICAgICAgICAgaWYgKHNob3VsZFBlcmZvcm1SZWRpcmVjdCkge1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyZWRpcmVjdCcsIHt1cmw6IHVybEhhc2gsIHJlZmVycmVyfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRCdXMgPSB0aGlzLmdldEV2ZW50QnVzKCk7XG4gICAgICAgICAgICAgICAgZXZlbnRCdXMgJiYgZXZlbnRCdXMuZmlyZSgncmVkaXJlY3QnLCB7dXJsOiB1cmxIYXNoLCByZWZlcnJlcn0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hvdWxkUGVyZm9ybVJlZGlyZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVsb2FkKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCh0aGlzLmN1cnJlbnRMb2NhdGlvbiwge2ZvcmNlOiB0cnVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZXRFdmVudEJ1cygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVyQ29udGV4dCAmJiB0aGlzLmVyQ29udGV4dC5nZXRFdmVudEJ1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0RXZlbnRCdXMoZXZlbnRCdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXJDb250ZXh0ICYmIHRoaXMuZXJDb250ZXh0LnNldEV2ZW50QnVzKGV2ZW50QnVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IExvY2F0b3IoKTtcbiAgICBpbnN0YW5jZS5Mb2NhdG9yID0gTG9jYXRvcjtcblxuICAgIHJldHVybiBpbnN0YW5jZTtcbn0pO1xuIl19 |