Statechange стреляет, когда я делаю push-state

Я использую history.js для обработки кнопки возврата. В history.js statechange срабатывает всякий раз, когда я делаю pushstate. Почему?

Ответы

Ответ 1

В соответствии с этим обсуждение в github ожидалось поведение history.js

Этот запрос на перенос утверждает, что он модифицировал history.js, чтобы быть более встроенным в спецификации W3C.

Ответ 2

Требуется добавить, да, это ожидаемое поведение History.js. В то же время есть больше обсуждений, которые критикуют это поведение, поскольку это не стандарт W3C и создает некоторую путаницу.

Вкратце, чтобы ответить на ваш вопрос: В функции History.js pushState() есть вызов для изменения состояния в конце.

Поверхность этого решения состоит в том, что вы можете просто изменить (нажать) ваше новое состояние и позволить функции onstatechange() обрабатывать переход. Даунсайд заключается в том, что вы не можете обрабатывать исключения/или записывать их в обработчик событий onstatechange.

Я лично предпочитаю способ W3C справиться с этим, так как вы можете различать кнопку "назад/вперед" и pushState. Поддерживающие History.js работают над решением внутреннего флага, которое позволяет вам изменить это поведение:

Обратите внимание, как вышеупомянутые вызовы [pushstate-calls] запускают события statechange, если для некоторых причина, по которой вы не хотите, чтобы это произошло, а затем в вашем statechange вы можете использовать следующее:

if ( History.getState().internal ) { return; }

* Эта функция в настоящее время находится в разработке и может использоваться только с версией "dev" для History.js! Надеюсь, это поможет некоторым другим людям в будущем:)

Ответ 3

После того, как мы попытаемся выполнить это в течение дня, я наконец нашел решение здесь: https://github.com/browserstate/history.js/issues/47#issuecomment-25750285

Код довольно прост, ссылка цитируется по ссылке:

Когда вы нажимаете свое состояние

History.pushState({
    _index: History.getCurrentIndex(),
    someData: ...
}, someTitle, someUrl);

а затем в случае привязки

History.Adapter.bind(window, 'statechange', function () {
    var currentIndex = History.getCurrentIndex();
    var internal = (History.getState().data._index == (currentIndex - 1));
    if (!internal) {
        // your action
    }
});