Chrome на iOS; назад/вперед не работает с history.pushState?

У меня есть веб-страница, которая использует history.pushState с идентификаторами фрагмента (т.е. #Heading1) и jQuery animate для навигации внутри документа.

Вот как я перемещаюсь по местоположению в документе:

$('nav a').click(function(e){
  e.preventDefault();
  var href = $(this).attr('href');
  history.pushState(null, null, href);
  $('#address').val(location.pathname + href);

  $('html, body').animate({
    'scrollTop': $(href).offset().top + 'px'
  });

Используя Google Chrome в iOS, адрес обновляется, как ожидалось, и анимация прокрутки отлично работает, но кнопки назад/вперед не попадают в идентифицированные теги.

Следует отметить, что при использовании кнопок "назад/вперед" URL-адрес в адресной строке изменяется. Он просто не подходит к идентифицированному тегу.

Я видел эту проблему только с помощью Google Chrome на iOS; iPhone и iPad.

Я создал Pen в CodePen с подмножеством моего кода, который должен продемонстрировать проблему: http://codepen.io/Ghodmode/pen/YqKGga


Update:
Я обновил ручку, чтобы сделать ее немного легче протестировать на iPhone/iPad. Вероятно, также лучше использовать представление отладки: http://s.codepen.io/Ghodmode/debug/YqKGga



Обновление 2:
Я создал еще одну страницу в CodePen, которая должна продемонстрировать проблему. На этот раз без jQuery: http://s.codepen.io/Ghodmode/debug/jqOqpq

Я еще не смог проверить это, потому что у меня нет прямого доступа к iPhone/iPad, но я действительно не думаю, что проблема имеет какое-то отношение к jQuery.


Он отлично работает:

  • Safari на iPhone/iPad
  • Google Chrome на Android
  • Mozilla Firefox на Android
  • Google Chrome в Windows
  • Mozilla Firefox в Windows
  • Internet Explorer в Windows

Я должен, вероятно, отметить, что у меня лично нет каких-либо устройств iOS, чтобы проверить это, но у меня есть надежный тестер, отправляющий мне видео и скриншоты о любых проблемах.

Поскольку анимация работает так, как ожидалось, она не кажется проблемой jQuery.

Ответы

Ответ 1

В iOS есть небольшая ошибка с API истории HTML5.

Вы пробовали:

window.addEventListener("popstate", function(e) {
    window.location.href = location.href;
});

Этот плагин может быть полезен (даже для фонового чтения) History.js. Он решает проблемы совместимости между браузерами, а также предоставляет дополнительный хеш-код HTML4, если вы хотите