Каков идеальный способ обработки 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);