Statechange запускается всякий раз, когда я делаю push-состояние - PullRequest
15 голосов
/ 05 января 2012

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

Ответы [ 3 ]

12 голосов
/ 13 января 2012

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

Короче говоря, чтобы ответить на ваш вопрос: в History.js функция pushState() - это вызов в конце состояния.

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

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

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

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

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

9 голосов
/ 07 января 2014

После попытки выполнить это в течение дня, я наконец нашел решение здесь: 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
    }
});
3 голосов
/ 05 января 2012

Согласно этому обсуждению на github , ожидается ожидаемое поведение history.js

В этом запросе на получение * утверждается, что он изменил history.js для большей совместимости со спецификациями W3C.

...