Ответ 1
Вы должны убедиться, что всегда существует состояние истории, которое вы нажали на текущей странице в истории, чтобы предотвратить нажатие кнопки "Назад" на загрузку страницы.
Если вы пытаетесь сохранить пользователя "содержащимся" в своем веб-приложении, так что кнопка "назад" всегда предоставляет какую-то функцию, вам нужно нажать не менее двух состояний на стек, а затем обязательно нажать другое состояние из ваш обработчик popstate.
var foo = {foo: true}; // state object
history.pushState(foo, "unused argument", "#newInitialUri");
...
var bar = {bar: true}
history.pushState(bar, "unused argument", "#newStateOfWebApp");
...
window.onpopstate = function(event){
...
var baz = {baz: true}
history.pushState(baz, "unused argument", "#baseState");
};
В приведенном выше примере скажем, что мы загрузили '/'. script начинает выполнение, и URI окна браузера изменяется на '/# newInitialUri', но загрузка страницы не происходит. Затем сразу же после этого URI браузера изменяется на "/# newStateOfWebApp", и загрузка страницы не происходит.
Пользователь нажимает кнопку "Назад" в своем браузере. Ваш обработчик popstate срабатывает. Во время вашего обработчика event.state равно foo, а браузер uri - '/# newInitialUri'. Нагрузка страницы отсутствует. Обработчик завершает завершение, вызывая history.pushState, и теперь браузер uri является "/# baseState". Нагрузка страницы отсутствует. Если пользователь снова запустится, ваше событие popstate снова запустится, event.state будет равно foo (снова), браузер uri будет "/# newInitialUri" (без загрузки страницы), а затем снова будет "/# baseState" (без загрузки страницы).
Важно помнить, что event.state в вашем обработчике popstate всегда содержит объект состояния для URI, к которому вы только что вернулись, а не тот, с которого вы только что пришли. Сначала это меня сбивало с толку, но имело смысл, когда я думал об этом. Например, пользователь, возможно, только что вернулся на вашу страницу, возможно, отправившись в Google. Объект состояния - это ваша возможность сообщить статус вашего приложения в ваш код.
Имейте в виду, что некоторые браузеры запускают событие popstate при загрузке страницы (что должно произойти в соответствии с спецификацией из моего понимания). Обязательно проверьте свой объект состояния в своем обработчике перед выполнением кода, чтобы убедиться, что вы не запускаете код, который вы не собираетесь использовать при загрузке страницы.
Последнее замечание: если вы используете jQuery для обработки событий, вам нужно использовать event.originalEvent.state для ссылки на объект состояния.