Popstate при загрузке страницы в Chrome - PullRequest
94 голосов
/ 21 июня 2011

Я использую History API для своего веб-приложения, и у меня есть одна проблема.Я делаю Ajax-вызовы, чтобы обновить некоторые результаты на странице и использую history.pushState () , чтобы обновить строку адреса браузера без перезагрузки страницы.Затем, конечно, я использую window.popstate , чтобы восстановить предыдущее состояние при нажатии кнопки назад.

Проблема хорошо известна - Chrome и Firefox по-разному обрабатывают событие popstate,Хотя Firefox не запускает его при первой загрузке, Chrome запускает.Я хотел бы иметь Firefox-стиль и не запускать событие при загрузке, так как он просто обновляет результаты с точно такими же при загрузке.Есть ли обходной путь, кроме использования History.js ?Причина, по которой мне не хочется его использовать, заключается в том, что для него нужно слишком много библиотек JS, и, поскольку мне нужно, чтобы он был реализован в CMS с уже слишком большим количеством JS, я хотел бы свести к минимуму количество JS, которое я в него помещаю..

Итак, хотелось бы узнать, есть ли способ заставить Chrome не запускать popstate при загрузке или, может быть, кто-то пытался использовать History.js, поскольку все библиотеки объединены в один файл.

Ответы [ 15 ]

0 голосов
/ 30 января 2014

Это сработало для меня в Firefox и Chrome

window.onpopstate = function(event) { //back button click
    console.log("onpopstate");
    if (event.state) {
        window.location.reload();
    }
};
0 голосов
/ 07 января 2014

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

<script src="//cdnjs.cloudflare.com/ajax/libs/history.js/1.8/native.history.min.js" type="text/javascript"></script>

И прочитайте API на https://github.com/browserstate/history.js

0 голосов
/ 05 декабря 2013

Лучший способ заставить Chrome не запускать popstate при загрузке страницы - это проголосовать за голосование https://code.google.com/p/chromium/issues/detail?id=63040. Они знают, что Chrome не соответствует спецификации HTML5 в течение двух полных лет и до сих пор остается убежищемне исправить это!

0 голосов
/ 21 июля 2013

Представленные решения имеют проблему при перезагрузке страницы.Кажется, что следующее работает лучше, но я тестировал только Firefox и Chrome.Он использует действительность, что, кажется, есть разница между e.event.state и window.history.state.

window.addEvent('popstate', function(e) {
    if(e.event.state) {
        window.location.reload(); // Event code
    }
});
0 голосов
/ 21 июня 2011

Вы можете создать событие и запустить его после обработчика загрузки.

var evt = document.createEvent("PopStateEvent");
evt.initPopStateEvent("popstate", false, false, { .. state object  ..});
window.dispatchEvent(evt);

Обратите внимание, что это немного сломано в Chrome / Safari, но я отправил патч в WebKit и он должен быть доступенскоро, но это «самый правильный» путь.

...