история.pushState не запускает событие popstate

Почему

$(function () {
  $(window).bind('popstate', function () {alert('pop');});

  window.history.pushState(null, '', '/foo');
});

не предупреждение pop ?

NB: тестирование на последнем chrome

--

по данным MDN:

событие popstate отправляется в окно при каждом изменении активной записи истории. Если активируемая запись журнала была создана вызовом pushState или затронута вызовом replaceState, свойство State события popstate содержит копию записи журнала государственный объект.

так почему мой pushState не вызывает popstate событие?

6 ответов


абзац, на который вы ссылаетесь, немного неоднозначен. Чтение пример на той же странице ясно, что popstate запускается только тогда, когда пользователь нажимает кнопку "назад", а не когда скрипт вызывает pushState().


вы можете вручную запустить popstate событие on window каждый раз, когда вы называете history.pushState().

history.pushState(state, '', url);

var popStateEvent = new PopStateEvent('popstate', { state: state });
dispatchEvent(popStateEvent);

Вы читаете "страницу руководства" MDN, которая не должна быть нормативной.

рассмотрим чтение MDN "страницы документации" для WindowEventHandlers.onpopstate вместо:

обратите внимание, что просто вызов истории.pushState() или истории.replaceState () не вызовет событие popstate. событие popstate запускается только при выполнении действия браузера например, щелчок по кнопке "Назад" (или история вызовов.back () в JavaScript). И только срабатывает, когда пользователь перемещается между двумя записями журнала для одного и того же документа.


мое решение:

var url = "http://awesome.website.net/route/to/paradise";
window.history.pushState({}, "", url);
window.history.pushState({}, "", url); // yes twice
window.history.back();

это вызовет мягкую навигацию через событие popstate и отсутствие HTTP-запроса.


Я тоже столкнулся с этим... Я думаю, что событие срабатывает, только если у вас есть что-то на верхнем уровне вашего объекта данных, отличное от предыдущего состояния.

попробуйте это:

var data = {rand: Math.random()};
window.history.pushState(data, '', '/foo');

документ https://developer.mozilla.org/en-US/docs/Web/Events/popstate говорит:

обратите внимание, что звоню history.pushState() или history.replaceState() не вызовет событие popstate. Событие popstate будет вызвано действием браузера, таким как щелчок по кнопке Назад или вперед (или вызов history.back() или history.forward() в JavaScript).