Различие между нажатой кнопкой «Назад» и кнопкой «Вперед», нажатой с помощью History API

Я использую API истории, чтобы отправить новый URL-адрес на веб-страницу без перезагрузки. У меня есть несколько кнопок, которые имеют разные функции.

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

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

Пример:

  1. index1.html
  2. нажмите кнопку → index2.html
  3. нажмите кнопку → index3.html
  4. нажата кнопка возврата → index2.html
  5. нажата кнопка «вперед» → URL-адрес теперь index3.html, но содержание index1.html

Я предполагаю, что это потому, что у меня есть слушатель, который слушает popstate, что происходит при нажатии кнопок «назад» и «вперед». Как я могу отличить, какая кнопка была нажата?

Это та часть, которая связывает слушателя:

if (window.history && window.history.pushState) {
    $(window).unbind('popstate');
    $(window).bind('popstate', function (e) {
        clearOverlays();
        var url = URL
        $.ajax ( {
            url : url
        }).done ( function ( data ) {
            console.log(data);
        });
    });
}

person Musterknabe    schedule 19.05.2014    source источник
comment
Вам не нужно различать вперед/назад. Вы должны использовать переменную state для хранения состояния, к которому переходит пользователь. Похоже, вы в настоящее время сохраняете его в глобальной переменной URL? P.S. Вы должны использовать on/off вместо bind/unbind в современных версиях jQuery.   -  person CodingIntrigue    schedule 19.05.2014
comment
Привет, хорошо, я изменил привязку/отвязку на вкл/выкл. Итак, лучшим способом было бы получить URL-адрес при срабатывании popstate, а затем загрузить контент?   -  person Musterknabe    schedule 19.05.2014
comment
URL-адрес не имеет значения при использовании History API. Это просто для обратной связи с пользователями, чтобы они знали, где они находятся. Как разработчик, вы должны сосредоточиться на переменной state, которую вы передали в pushState: history.pushState(**{ status: "OpenFile" }**, "Open", "irrelevanturl.html");   -  person CodingIntrigue    schedule 19.05.2014
comment
это может помочь вам найти ответ: stackoverflow.com/questions/25806608/   -  person aditya shrivastava    schedule 19.09.2016
comment
Как сделать Я получаю, происходит ли событие popstate от действий назад или вперед с pushstate HTML5? обсуждение может быть уместным.   -  person Leonid Vasilev    schedule 07.03.2018
comment
Вы также можете добавить механизм глубоких ссылок, который будет анализировать URL-адрес и знать, что он должен загрузить. После того, как он у вас есть, вы можете просто изменить URL-адрес с помощью API истории и позволить маршрутизатору сделать все остальное....   -  person Lior.Shacham    schedule 15.05.2018
comment


Ответы (1)


Вот способ упростить ваш код:

Вы можете использовать встроенный тег <a> с вложенным тегом <input> для перехода между страницами. Window.open() создаст всплывающее окно, а window.location.replace() отключит API истории, ни один из которых вам не поможет, поэтому вложенный тег <input> (внутри тега <a>) является наиболее логичным решением.

Что касается различения кнопок, вы можете использовать атрибут HTML onclick в каждой кнопке, чтобы указать функцию JS для выполнения, в вашем случае window.history.back() и window.history.forward().

Например, вы можете использовать следующее.

<!DOCTYPE html>
<!-- Example of code for your first page -->
<html lang="en">

<head>
  <!-- Metadata -->
</head>

<body>
  <h1>Page 1.html</h1>
  <!-- The <a> tag below is what transitions between pages. The <input> tag is just for the appearance of a button. -->
  <a href="yourlink.html"><input type="button" value="page2"></a>
  <!-- Input tags below are required, unless you want to use 'javascript:(function)' in an <a> tag -->
  <input type="button" onclick="window.history.back()" value="Go back">
  <input type="button" onclick="window.history.forward()" value="Go forward">
</body>

</html>

person Ben Z.    schedule 22.08.2018