Каков идеальный способ обработки window.onpopstate для всех браузеров?

Для chrome событие запускается при загрузке страницы, но в firefox оно срабатывает по праву, только когда вы нажимаете кнопку "назад" или "вперед". Итак, как написать скрипт, который отлично работает для всех браузеров?

2 ответа

Решение

Я бы пошел на обнаружение браузера на этом (на самом деле, я сделал). Я использую.data() jquery, чтобы установить логический флаг для проверки:

// chrome fires a popstack event on page load, so do a check before proceeding
var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
if( is_chrome && !$('body').data('allow-popstate-action') ) {
    $('body').data('allow-popstate-action', true);
    return false;
}

Я добавил это условное предложение в функцию, которая связана с событием popstate, поэтому при первом вызове в Chrome (при загрузке страницы) он просто выходит из функции, ничего не делая. В следующий раз (кнопки назад / назад) все будет работать нормально.

Я застрял со старой версией jQuery в этом проекте, поэтому я не мог использовать jQuery.browser.webkit, но вы, вероятно, можете.

Несколько более элегантный способ - добавить время ожидания в 1 мс перед добавлением слушателя popstate. Поскольку начальное popstate сработает до того, как будет выполнен любой асинхронный код, ваша функция popstate будет работать правильно (только при действиях вперед / назад):

window.setTimeout(function(){
    $(window).on('popstate', function(event){
        // do things
    });
}, 1);
Другие вопросы по тегам