Как я могу игнорировать window.onpopstate при загрузке страницы? - программирование
Подтвердить что ты не робот

Как я могу игнорировать window.onpopstate при загрузке страницы?

Я играю с window.onpopstate, и есть кое-что, что меня немного раздражает:

Браузеры, как правило, обрабатывают событие popstate по-разному при загрузке страницы. Chrome и Safari всегда генерируют событие popstate при загрузке страницы, но Firefox не работает.

источник

Я тестировал его, и да, в Chrome и Safari 5.1+ событие popstate запускается при загрузке страницы, но не в Firefox или IE10.

Проблема заключается в том, что я хочу слушать только события popstate, где пользователь нажал кнопку "Назад" или "Переслать" (или история была изменена с помощью javascript), но не хочет ничего делать в pageload.

Другими словами, я хочу различать событие popstate от загрузки страницы из других событий popstate.

Это то, что я пробовал до сих пор (я использую jQuery):

$(function() {
  console.log('document ready');

  setTimeout(function() {
    window.onpopstate = function(event) {
      // Do something here
    }, 10);
});

В основном я пытаюсь привязать функцию listener к popstate достаточно поздно, чтобы не быть привязанным к загрузке страницы, только позже.

Кажется, что это работает, но мне не нравится это решение. Я имею в виду, как я могу быть уверенным, что таймаут, выбранный для setTimeout, достаточно велик, но не слишком большой (потому что я не хочу, чтобы он слишком долго ждал).

Я надеюсь, что есть более разумное решение!

4b9b3361

Ответ 1

Проверить логическую истину event.state в popstate обработчике событий:

window.addEventListener('popstate', function(event) {
    if (event.state) {
        alert('!');
    }
}, false);

Чтобы это сработало, всегда укажите аргумент состояния < null при вызове history.pushState() или history.replaceState(). Кроме того, рассмотрите возможность использования библиотеки обертки, например History.js, которая обеспечивает согласованное поведение в браузерах.

Ответ 2

У меня была аналогичная проблема, и я должен был проверить, чтобы убедиться, что страница полностью загружена.

Я использовал что-то вроде этого:

var page_loaded = false;    
window.onpopstate = function(event){
    if(!page_loaded){
       page_loaded = true;
       return false;
     }
    //Continue With Your Code
}

Ответ 3

Чтобы реагировать на событие popstate, вам нужно нажать какое-то состояние на историю сеансов.

Например, добавьте эту строку в раздел готовности документа:

history.pushState(null, null, window.location.pathname);

Не идеально, но он работает и в Chrome, Firefox и других браузерах.

Затем событие запускается правильно, когда пользователь нажимает кнопку "Назад" или "Вперед", также когда методы history.back(), history.forward(), history.go() вызываются вручную. Каждый раз, когда вызывается popstate, вам нужно снова нажать другое состояние, чтобы заставить его работать.

См. также:

Ответ 4

Похоже, что ни один из браузеров больше не генерирует событие при загрузке страницы на сегодняшний день:

Браузеры по-разному обрабатывали событие popstate при загрузке страницы, но теперь они ведут себя одинаково. Firefox никогда не генерировал событие popstate при загрузке страницы. Chrome работал до версии 34, а Safari - до версии 10.0.

Источник: https://developer.mozilla.org/en-US/docs/Web/API/PopStateEvent