Как сохранить чистую историю браузера в магистрали.приложение на JS?

мой позвоночник.Яш имеет три вида:

  1. список категорий
  2. список товаров в категории
  3. форму для отдельного элемента

Я использую костяк.маршрутизатор js для навигации между этими представлениями. Потоки пользователей в приложении go 12, 23 и 3 --> 1. Пользователь может перемещаться вперед и назад с помощью кнопок браузера назад и вперед, что является желаемым поведением. Глубокая привязка к любому элементу также работает.

проблема в том, что я хочу сохранить историю в чистоте. Вот пример потока использования:

  • пользователь открывает список категорий. История: "список категорий" (правильно)
  • выбрать "моя категория". История: "моя категория"
  • выбрать "мой товар". История: "мой товар"
  • пользователь заполняет форму и сохраняет, попадает в "список категорий". История: "список категорий"

еще пример:

  • пользователь открывает url "моя категория"
  • пользователь нажимает кнопку home. История: "список категорий"

есть идеи, как реализовать это в чистом виде?

2 ответов


нет способа реализовать первый пример, который вы предоставили. Вы не можете реализовать первый пример, потому что нет способа "удалить" историю браузера с помощью Javascript.

нет способа очистить историю сеансов или отключить навигацию назад/вперед от непривилегированного кода. Самое близкое доступное решение-это местоположение.метод replace (), который заменяет текущий элемент истории сеанса предоставленным URL-адресом.

- https://developer.mozilla.org/en/DOM/window.history

в лучшем случае вы можете предотвратить добавление текущей страницы в историю браузера с помощью 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 is 0-в настоящее время мы находимся на странице "категория-список".
  • если 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