Ответ 1
В соответствии с этим обсуждение в github ожидалось поведение history.js
Этот запрос на перенос утверждает, что он модифицировал history.js, чтобы быть более встроенным в спецификации W3C.
Я использую history.js для обработки кнопки возврата. В history.js statechange срабатывает всякий раз, когда я делаю pushstate. Почему?
В соответствии с этим обсуждение в github ожидалось поведение history.js
Этот запрос на перенос утверждает, что он модифицировал history.js, чтобы быть более встроенным в спецификации W3C.
Требуется добавить, да, это ожидаемое поведение History.js. В то же время есть больше обсуждений, которые критикуют это поведение, поскольку это не стандарт W3C и создает некоторую путаницу.
Вкратце, чтобы ответить на ваш вопрос: В функции History.js pushState()
есть вызов для изменения состояния в конце.
Поверхность этого решения состоит в том, что вы можете просто изменить (нажать) ваше новое состояние и позволить функции onstatechange() обрабатывать переход. Даунсайд заключается в том, что вы не можете обрабатывать исключения/или записывать их в обработчик событий onstatechange.
Я лично предпочитаю способ W3C справиться с этим, так как вы можете различать кнопку "назад/вперед" и pushState. Поддерживающие History.js работают над решением внутреннего флага, которое позволяет вам изменить это поведение:
Обратите внимание, как вышеупомянутые вызовы [pushstate-calls] запускают события statechange, если для некоторых причина, по которой вы не хотите, чтобы это произошло, а затем в вашем statechange вы можете использовать следующее:
if ( History.getState().internal ) { return; }
* Эта функция в настоящее время находится в разработке и может использоваться только с версией "dev" для History.js! Надеюсь, это поможет некоторым другим людям в будущем:)
После того, как мы попытаемся выполнить это в течение дня, я наконец нашел решение здесь: 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
}
});