mirror of
https://github.com/twisterarmy/twister-react.git
synced 2025-01-27 15:14:30 +00:00
86 lines
1.9 KiB
JavaScript
86 lines
1.9 KiB
JavaScript
'use strict';
|
|
|
|
var LocationActions = require('../actions/LocationActions');
|
|
var History = require('../History');
|
|
|
|
var _listeners = [];
|
|
var _isListening = false;
|
|
|
|
function notifyChange(type) {
|
|
var change = {
|
|
path: HistoryLocation.getCurrentPath(),
|
|
type: type
|
|
};
|
|
|
|
_listeners.forEach(function (listener) {
|
|
listener.call(HistoryLocation, change);
|
|
});
|
|
}
|
|
|
|
function onPopState(event) {
|
|
if (event.state === undefined) {
|
|
return;
|
|
} // Ignore extraneous popstate events in WebKit.
|
|
|
|
notifyChange(LocationActions.POP);
|
|
}
|
|
|
|
/**
|
|
* A Location that uses HTML5 history.
|
|
*/
|
|
var HistoryLocation = {
|
|
|
|
addChangeListener: function addChangeListener(listener) {
|
|
_listeners.push(listener);
|
|
|
|
if (!_isListening) {
|
|
if (window.addEventListener) {
|
|
window.addEventListener('popstate', onPopState, false);
|
|
} else {
|
|
window.attachEvent('onpopstate', onPopState);
|
|
}
|
|
|
|
_isListening = true;
|
|
}
|
|
},
|
|
|
|
removeChangeListener: function removeChangeListener(listener) {
|
|
_listeners = _listeners.filter(function (l) {
|
|
return l !== listener;
|
|
});
|
|
|
|
if (_listeners.length === 0) {
|
|
if (window.addEventListener) {
|
|
window.removeEventListener('popstate', onPopState, false);
|
|
} else {
|
|
window.removeEvent('onpopstate', onPopState);
|
|
}
|
|
|
|
_isListening = false;
|
|
}
|
|
},
|
|
|
|
push: function push(path) {
|
|
window.history.pushState({ path: path }, '', path);
|
|
History.length += 1;
|
|
notifyChange(LocationActions.PUSH);
|
|
},
|
|
|
|
replace: function replace(path) {
|
|
window.history.replaceState({ path: path }, '', path);
|
|
notifyChange(LocationActions.REPLACE);
|
|
},
|
|
|
|
pop: History.back,
|
|
|
|
getCurrentPath: function getCurrentPath() {
|
|
return decodeURI(window.location.pathname + window.location.search);
|
|
},
|
|
|
|
toString: function toString() {
|
|
return '<HistoryLocation>';
|
|
}
|
|
|
|
};
|
|
|
|
module.exports = HistoryLocation; |