popstate, webkit и старый Chrome
20 февраля 2015
Вроде бы рекомендацию HTML5 приняли, поддержка JavaScript везде неплохая. Думал, проблем поработать с историей браузера не будет.
Не тут-то было! Оказывается, Safari и старые Chrome вызывают лишнее событие popstate при начальной загрузке страницы. Chrome это в современных своих версиях поправил, а вот в актуальном Safari проблема есть.
Изучение кода pjax и гугление дало много разных решений. Вот правильное (код для jQuery, но без него будет примерно оно же):
$(window).load(function() { setTimeout(function() { $(window).on('popstate', function (e) { // работаем }); }, 0); });
Идея в том, чтобы зарегистрировать наш обработчик после того, как начальное событие popstate
всплывёт. Всплывает оно по load
, поэтому вешаем обработчик на него. setTimeout
с задержкой 0
нужен для того, чтобы обработчик был последним.
Комментарии RSS по email OK
А зачем поощрять использование старых браузеров усложняя разработку и продолжая их существование ?
Почему нельзя сделать проверку на поддержку html5 (оброзно гвооря делаем проверку на наличие нового объекта типа FormData), если поддержки нет, то просим пользователя обновить браузер.
Так и прогрес можно двигать вперед и избавляться от всяких там ие 8, 9 и 10.
@Nepster, потому что гипотетический пользователь хочет получить нашу страницу, а не обновлять браузер (тем более что до сих пор у многих этот процесс вызывает затруднение). Так эе у определенных пользователей может не быть возможности самостоятельно обновлять браузеры (например на рабочем месте)
Nepster, как-бы Safari с webkit не старый. Современный.
Поддержка HTML5 и history API есть в обоих случаях.
@Undestroyer, я бы сказал не столько затруднения, сколько нежелания. В большинстве случаев ведь такие люди отговариваются фразой вроде "привык, и не хочу ничего менять", несмотря на доводы о безопасности, скорости и удобности.
Спасибо большое, два дня убил на сафари пока нашел из за чего у меня постоянный релоад :)
Спасибо за решение! Весь инет перерыл пока нашел.