history.pushState не вызывает событие «popstate»

Зачем

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

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

не предупреждаетpop ?

Примечание: тестирование на последнем Chrome

--

В соответствии сMDN:

A popstate event is dispatched to the window every time the active history entry changes. If the history entry being activated was created by a call to pushState or affected by a call to replaceState, the popstate event's state property contains a copy of the history entry's state object.

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

Ответы на вопрос(7)

Подумайте о том, чтобы прочитать MDN& quot; страница документации & quot; заWindowEventHandlers.onpopstate вместо:

Note that just calling history.pushState() or history.replaceState() won't trigger a popstate event. The popstate event is only triggered by doing a browser action such as a clicking on the back button (or calling history.back() in JavaScript). And the event is only triggered when the user navigates between two history entries for the same document.

чего вы пытаетесь достичь, но если вы просто хотите, чтобы ваш обработчик событий popState запускался, вы можете просто извлечь его из функции, как показано ниже:

function popStateHandler(event) {
     // Event handling Code here
}
window.onpopstate = popStateHandler;

Затем вы можете просто вызвать ваш popStateHandler после нажатия pushState.

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

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

var data = {rand: Math.random()};
window.history.pushState(data, '', '/foo');
 12 янв. 2014 г., 01:55
Это также не вызывает popstate. По крайней мере, не на Firefox 26.

popstate событие наwindow каждый раз, когда вы звонитеhistory.pushState().

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

var popStateEvent = new PopStateEvent('popstate', { state: state });
dispatchEvent(popStateEvent);
 10 авг. 2017 г., 16:22
Отличный ответ, большое спасибо!

https://developer.mozilla.org/en-US/docs/Web/Events/popstate говорит:

Note that just calling history.pushState() or history.replaceState() won't trigger a popstate event. The popstate event will been triggered by doing a browser action such as a click on the back or forward button (or calling history.back() or history.forward() in JavaScript).

Решение Вопроса

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

 12 янв. 2014 г., 01:49
popstate также запускается, когда пользователь нажимает кнопку «вперед».
 07 сент. 2016 г., 15:46
pushstate действительно вызывает popstate! Следовательно, «событие popstate отправляется окну каждый раз, когда изменяется активная запись истории»!
 08 сент. 2016 г., 04:22
@AlexGill У вас есть тест-кейс, демонстрирующий такое поведение? Что-то вроде: `window.onpopstate = function (e) {alert ('popstate'); } history.pushState (null, '' '); `

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

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

 16 сент. 2015 г., 01:49
Это то, что делают все интерфейсные фреймворки?
 02 мая 2016 г., 10:23
Это отстой, потому что вы в конечном итоге с избыточным состоянием пересылки. Нет, фреймворки этого не делают. У них просто есть хороший код, который вызывает один и тот же обратный вызов на обоихpopstate и послеpushState.

Ваш ответ на вопрос