Вроде бы рекомендацию HTML5 приняли, поддержка JavaScript везде неплохая. Думал, проблем поработать с историей браузера не будет.
Не тут-то было! Оказывается, Safari и старые Chrome вызывают лишнее событие popstate при начальной загрузке страницы. Chrome это в современных своих версиях поправил, а вот в актуальном Safari проблема есть.
Изучение кода pjax и гугление дало много разных решений. Вот правильное (код для jQuery, но без него будет примерно оно же):
$(window).load(function() { setTimeout(function() { $(window).on('popstate', function (e) { // работаем }); }, 0); });
Идея в том, чтобы зарегистрировать наш обработчик после того, как начальное событие popstate
всплывёт. Всплывает оно по load
, поэтому вешаем обработчик на него. setTimeout
с задержкой 0
нужен для того, чтобы обработчик был последним.