Как сохранить чистую историю браузера в магистрали.приложение на JS?
мой позвоночник.Яш имеет три вида:
- список категорий
- список товаров в категории
- форму для отдельного элемента
Я использую костяк.маршрутизатор js для навигации между этими представлениями. Потоки пользователей в приложении go 12, 23 и 3 --> 1. Пользователь может перемещаться вперед и назад с помощью кнопок браузера назад и вперед, что является желаемым поведением. Глубокая привязка к любому элементу также работает.
проблема в том, что я хочу сохранить историю в чистоте. Вот пример потока использования:
- пользователь открывает список категорий. История: "список категорий" (правильно)
- выбрать "моя категория". История: "моя категория"
- выбрать "мой товар". История: "мой товар"
- пользователь заполняет форму и сохраняет, попадает в "список категорий". История: "список категорий"
еще пример:
- пользователь открывает url "моя категория"
- пользователь нажимает кнопку home. История: "список категорий"
есть идеи, как реализовать это в чистом виде?
2 ответов
нет способа реализовать первый пример, который вы предоставили. Вы не можете реализовать первый пример, потому что нет способа "удалить" историю браузера с помощью Javascript.
нет способа очистить историю сеансов или отключить навигацию назад/вперед от непривилегированного кода. Самое близкое доступное решение-это местоположение.метод replace (), который заменяет текущий элемент истории сеанса предоставленным URL-адресом.
в лучшем случае вы можете предотвратить добавление текущей страницы в историю браузера с помощью window.location.replace
или window.history.replaceState
. Позвоночник.js предоставляет удобный способ сделать это, позвонив router.navigate(fragment, [options])
на объекте маршрутизатора и указание {replace: true}
в параметрах.
вместо того, чтобы полагаться на разные маршруты, чтобы определить, какой вид отображать, я бы попытался вместо этого написать главный вид, который может обрабатывать отображение / скрытие определенных представлений.
редактировать
Ok, въезд на территорию хакеров...
поскольку кажется, что страница "список категорий" - это страница, на которой история должна быть" сброшена", решение, которое я опубликовал, пытается решить оба варианта использования, которые вы упомянули. Код отслеживает historyState
переменная, которая представляет, когда посещается страница" категория-список", а также другие страницы, посещенные после он.
// in your application init...
$(function(){
window.historyState = -1;
router = new Backbone.Router({
routes: {
"category-list": category-list,
"category": category,
"item": item
}
category-list: function(){
historyState = 0;
},
category: function(){
if(historyState >= 0)
historyState++;
},
item: function(){
if(historyState >= 0)
historyState++;
}
});
});
- если
historyState
is-1
- мы еще не посетили страницу "категория-список". - если
historyState
is0
-в настоящее время мы находимся на странице "категория-список". - если
historyState
больше0
- количество посещенных страниц с момента просмотра страницы" категория-список".
теперь в любое время ссылка используется для перехода на страницу "категория-список", убедитесь, что он вызывает следующий метод для обработки соответствующего навигация.
function routeToCategoryList(){
if( historyState > 0 ){
// 'category-list' already exists in our history route to that page.
window.history.go((historyState * -1));
} else {
// otherwise, don't store an entry for the current page we are on.
router.navigate("/category-list", {trigger: true, replace: true});
}
}
если страница "категория-список" уже была посещена, вернитесь в историю соответствующее количество записей (это, к сожалению, сохраняет другие страницы в истории, поэтому вы все равно можете перейти к ним). В противном случае, если страница "список категорий" еще не посещена, перейдите к ней и не добавляйте текущую страницу в историю.
нет способа удалить историю из истории магистрали, вы можете перенаправить навигацию, добавив некоторую логику, получив текущий фрагмент
или вы можете использовать историю.js (работает на большей части браузера)
в то время как https://developer.mozilla.org/en/DOM/window.history только для Mozila firefox так что это не работает для android app