Есть ли способ в History.js узнать, когда была нажата кнопка «Назад»

Я начал тестировать History.js. После понимания того, как это работает и что popstate нет, вместо него statechange. Я ищу способ отличаться при нажатии кнопки «Назад» в браузере.

Причина в том, что мне нужно знать URL-адрес до того, как состояние переместится, из того, в которое я собираюсь. С учетом сущности проекта просматривается только URL-адрес, на который мы переходим.

Я надеюсь, что решение состоит не в том, чтобы отслеживать последний посещенный URL-адрес в глобальной переменной.

Спасибо


person maraujop    schedule 21.11.2011    source источник


Ответы (5)


Я обнаружил, что решения на github немного преувеличены для моих целей. Я создал логическое значение, которое всегда истинно, за исключением случаев, когда я использовал Историю для изменения состояния.

var manualStateChange = true;

History.Adapter.bind(window,'statechange',function(){
    if(manualStateChange == true){
     // BACK BUTTON WAS PRESSED
    }
    manualStateChange = true;
});

Каждый раз, когда я изменяю состояние программно, устанавливаю для логического значения значение false:

manualStateChange = false;
History.pushState(null, null, currentPath);
person ashack    schedule 09.05.2013
comment
Я сделал то же самое, но это не будет различать кнопки «назад» и «вперед». - person GTCrais; 29.12.2014
comment
Это именно то, что мне было нужно, спасибо :D ... Мне просто нужно было location.reload() в // BACK BUTTON PRESSED бите, так что "назад" и "вперед" не проблема :D - person Just Lucky Really; 27.09.2015
comment
Я согласен с @GTCrais, что это не будет различать кнопки «назад» и «вперед». Так что комментарий // BACK BUTTON WAS PRESSED в вашем коде вводит в заблуждение. Вы должны изменить его на // BACK OR FORWARD BUTTON WAS PRESSED. - person mikep; 05.11.2018

Я знаю, что это довольно устаревший вопрос, но я нашел решение проблем с кнопкой «назад/вперед» при переключении между стандартной страницей и страницей состояния истории.

Сценарий: используйте историю HTML5 (или плагин history.js) на наборе страниц. Затем на других страницах нам нужны реальные загрузки, также известные как стандартная страница (не спрашивайте, почему, но есть определенные варианты использования, в которых это может понадобиться)

Когда вы переходите со страницы состояния истории и выполняете реальную загрузку на стандартную страницу. Вы не можете вернуться НАЗАД: он меняет URL-адрес, но не загружает страницу — он только запускает изменение состояния; который я предполагаю, является проблемой оригинального поста. Мое личное мнение состоит в том, что это ошибка браузера (однако проблема есть во всех браузерах), потому что браузер должен знать, что страница, на которой вы находитесь, была перезагружена за пределами страницы состояния истории.

Я исправил это с помощью чего-то очень простого: прослушивание события statechange и указание браузеру обновляться, когда оно срабатывает. Таким образом, мне все равно, возвращаются они назад или вперед с этой страницы. Если браузер считает, что состояние изменяется (ссылки не запускают событие statechange), это событие запускается только назад/вперед на странице состояния истории, поэтому проблема решается.

Код с использованием плагина jQuery + History.js:

$(window).on('statechange', function() {
    window.location.reload();
});

Если это не имеет смысла, вероятно, у вас нет этой проблемы. Однако я заметил это на многих сайтах, которые действительно используют историю HTML 5 (даже на pinterest.com возникает эта проблема, если вы перезагружаетесь в модальном изображении, а затем пытаетесь вернуться).

Надеюсь, если у вас есть эта проблема, вы найдете этот ответ и вздохнете с огромным облегчением :)

person James Wagoner    schedule 01.02.2013
comment
Я думал о похожей логике, однако изменение состояния запускается, когда выдается pushState и когда нажимается назад/вперед, что создает бесконечный цикл перезагрузки. - person Dean; 02.11.2013
comment
Действительно, огромное облегчение. Я собирался сдаться. - person Christoffer Bubach; 25.05.2014

Я, наконец, управлял всеми ссылками, используя History.pushState, таким образом, нет необходимости различать нажатую кнопку «Назад». Мы обрабатываем все изменения состояния одинаково.

Редактировать: Нашел эти две проблемы в Github History.js, может кому-то поможет. https://github.com/browserstate/history.js/issues/70 https://github.com/browserstate/history.js/issues/47

person maraujop    schedule 30.11.2011

В «официальной» версии эта функция недоступна. Попробуйте использовать этот файл в основном файле while: https://github.com/danger89/history.js/blob/master/scripts/bundled/html5/jquery.history.js

Я не могу гарантировать, что его решение работает для каждого браузера. Но это хорошее решение. Если вы применили его изменения, вы можете использовать:

var State = History.getState();
if (State.navigation) {
    // Back / forward button is pressed.
}

Дополнительную информацию можно найти в выпуске 47 Github.

person danger89    schedule 27.01.2016

Аналогичный ответ, чем у Джеймса Вагонера. событие «statechange» запускалось в обоих направлениях, поэтому вместо этого я проверяю только событие «popstate», которое в моем случае вызывается только тогда, когда пользователь возвращается.

window.addEventListener('popstate', function() {
  window.location.reload();
});
person Tim Coysh    schedule 16.08.2016