Используя API html5 window.history
, я могу хорошо управлять навигацией в своем веб-приложении.
Приложение в настоящее время имеет два состояния: selectDate
(1) и enterDetails
(2).
Когда приложение загружается, я replaceState
и устанавливаю прослушиватель popState
:
history.replaceState({stage:"selectDate",...},...);
window.onpopstate = function(event) {
that.toStage(event.state.stage);
};
Когда выбрана дата и приложение переходит на этап 2, я нажимаю состояние 2 на стек:
history.pushState({stage:"enterDetails",...},...);
Это состояние заменяется при изменении всех деталей, поэтому они сохраняются в истории.
Есть три способа выйти из стадии 2:
- Сохранить (ajax submit)
- отменить
- Кнопка назад
Кнопка "Назад" обрабатывается слушателем popstate
. Кнопка "Отмена" выдвигает этап 1, чтобы пользователь мог вернуться к деталям, которые они вводили на кнопку "Назад". Они оба работают хорошо.
Кнопка сохранения должна вернуться к этапу 1 и не позволить пользователю перейти на страницу сведений (поскольку они уже отправлены). В основном, y это должно сделать стек истории длиной = 1.
Но, похоже, нет history.delete()
или history.merge()
. Лучшее, что я могу сделать, это history.replaceState(stage1)
который оставляет стек истории как: ["selectDate","selectDate"]
.
Как избавиться от одного слоя?
Редактировать:
Мысль о чем-то другом, но это тоже не работает.
history.back(); //moves history to the correct position
location.href = "#foo"; // successfully removes ability to go 'forward',
// but also adds another layer to the history stack
Это оставляет стек истории как ["selectDate","selectDate#foo"]
.
Итак, как альтернатива, есть ли способ удалить "форвардную" историю без нажатия нового состояния?