JS: ошибочное всплывающее событие при попытке вернуться назад после начальной загрузки страницы

Я пытаюсь реализовать историю JS, используя pushState / popState. Навигация назад и вперед работает просто отлично, но у меня проблемы с навигацией до начальной загрузки страницы с помощью кнопки "Назад" браузера. Требуется 1 дополнительное нажатие на кнопку назад браузера, чтобы покинуть страницу. Это почему?

function action(text) {
  history.pushState({"text":text}, text);
  doAction(text);
}

function doAction(text) {
  $('span').text(text);
}

var $button = $('button');
var $p = $('p');

$p.hide();

action("foo");
$button.on('click', function(){
  action("bar");
  $button.hide();
  $p.show();
})

window.addEventListener("popstate", function(e) {
  if (e.state !== null) {
      $button.show();
      $p.text("Next back should navigate away from this page");
  } else {
      $p.text("Still here? Why is that? Next back will really navigate away");
  }
});

https://jsfiddle.net/lilalinux/p8ewyjr9/20/

Изменить: протестировано с Chrome OS/X

1 ответ

Решение

Начальная загрузка страницы не должна использовать history.pushState потому что это добавит еще одну запись истории. Существует уже неявный первый элемент истории с состоянием null,

С помощью history.replaceState для начальной загрузки страницы, устанавливает состояние для этого элемента, но не добавляет другое.

var initialPageLoad = true;
function action(text) {
  if (initialPageLoad) {
    // replace the state of the first (implicit) item
    history.replaceState({"text":text}, text);
  } else {
    // add new history item
    history.pushState({"text":text}, text);
  }
  initialPageLoad = false;
  doAction(text);
}

function doAction(text) {
  $('span').text(text);
}

var $button = $('button');
var $p = $('p');

$p.hide();

action("foo");
$button.on('click', function(){
  action("bar");
  $button.hide();
  $p.show();
})

window.addEventListener("popstate", function(e) {
  if (e.state !== null) {
      $button.show();
      $p.text("Next back should navigate away from this page");
//  } else {
// won't happen anymore, as the first item has state now
//      $p.text("Still here? Why is that? Next back will really navigate away");
  }
});
Другие вопросы по тегам