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
'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; |