'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 ''; } }; module.exports = HistoryLocation;