You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.9 KiB
86 lines
1.9 KiB
10 years ago
|
"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;
|