Это потому, что метод history.go()
является асинхронным. Документы по MDN говорят следующее:
Этот метод является асинхронным. Добавьте прослушиватель для метода popstate, чтобы определить, когда навигация завершена.
Таким образом, replaceState
выполняется до завершения go(-1)
. Именно это и вызывает поведение.
Используйте событие popstate
в сочетании с History API для возврата go и замените правильное состояние. Событие popstate
запускается всякий раз, когда вы go возвращаетесь в состояния, которые вы отправили в коллекцию истории. Использование history.go(-1)
, history.back()
или нажатие кнопки «Назад» в браузере вызовет его.
И если вы говорите, что хотите go вернуться на страницу first, затем установите значение .go()
на -2
, если хотите, чтобы go вернулось два места в истории.
В прослушивателе событий проверьте значение location.hash
текущего местоположения, которым вы являетесь в. Это позволит вам знать, если вы достигли правильной страницы. Затем используйте replaceState
для правильной установки состояния.
window.addEventListener('popstate', function(event) {
if (window.location.hash === 'page1') {
window.history.replaceState('','','#replaced');
}
});
window.history.pushState('','','#page1');
window.history.pushState('','','#page2');
window.history.pushState('','','#page3');
window.history.go(-2);