Если вы не хотите принимать специальные меры для каждого обработчика, который вы добавляете в onpopstate, моё решение может быть вам интересно.Большим плюсом этого решения также является то, что события onpopstate могут быть обработаны до завершения загрузки страницы.
Просто запустите этот код один раз, прежде чем добавлять какие-либо обработчики onpopstate, и все должно работать как положено (иначекак в Mozilla ^^) .
(function() {
// There's nothing to do for older browsers ;)
if (!window.addEventListener)
return;
var blockPopstateEvent = document.readyState!="complete";
window.addEventListener("load", function() {
// The timeout ensures that popstate-events will be unblocked right
// after the load event occured, but not in the same event-loop cycle.
setTimeout(function(){ blockPopstateEvent = false; }, 0);
}, false);
window.addEventListener("popstate", function(evt) {
if (blockPopstateEvent && document.readyState=="complete") {
evt.preventDefault();
evt.stopImmediatePropagation();
}
}, false);
})();
Как это работает:
Chrome , Safari и, возможно, другие браузеры webkit работаютсобытие onpopstate, когда документ был загружен.Это не предназначено, поэтому мы блокируем события popstate до первого цикла цикла событий после загрузки документа.Это делается с помощью вызовов warnDefault и stopImmediatePropagation (в отличие от stopPropagation stopImmediatePropagation мгновенно останавливает все вызовы обработчика событий).
Однако, поскольку readyState документа уже находится в состоянии «завершено», когда Chrome вызывает ошибки onpopstate по ошибке, мы разрешаем события opopstate,которые были запущены до завершения загрузки документа, чтобы разрешить вызовы onpopstate до загрузки документа.
Обновление 2014-04-23: Исправлена ошибка, при которой события popstate блокировались, еслискрипт выполняется после загрузки страницы.