Кнопка возврата в Mobile Safari

Проблема, которую я нашел, очень похожа на этот вопрос, за исключением того, что Safari на настольных компьютерах, похоже, решила проблему. По существу, проблема заключается в следующем: когда клиент просматривает сафари на мобильных устройствах, а страница выполняет функцию javascript на страницеa.html, затем перейдите на pageb.html, затем нажмите кнопку "Назад", чтобы вернуться на страницуa.html, функцию javascript не будет работать, когда клиент нажал кнопку "Назад", чтобы вернуться к странице .html. Он пропустит вызов javascript.

Я пробовал решения, упомянутые в ссылке выше, но ничего не работает для мобильного Safari. Кто-нибудь еще столкнулся с этой ошибкой? Как вы справились с этим?

Ответ 1

Это вызвано back-forward cache. Предполагается сохранить полное состояние страницы, когда пользователь перемещается. Когда пользователь перемещается назад с помощью кнопки "Назад", вы можете быстро загрузиться из кеша. Это отличается от обычного кеша, который кэширует только HTML-код.

При загрузке страницы для bfcache onload событие не будет запущено. Вместо этого вы можете проверить свойство persisted события onpageshow. Он установлен на значение false при начальной загрузке страницы. Когда страница загружается из bfcache, она имеет значение true.

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From back / forward cache.");
    }
};

По какой-то причине jQuery не имеет этого свойства в событии. Однако вы можете найти его на оригинальном мероприятии.

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
      alert("From back / forward cache.");
    }
});

Быстрое решение этой проблемы - перезагрузка страницы при нажатии кнопки "Назад". Это, однако, сводит на нет любой положительный эффект, который даст задний/передний кеш.

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload() 
    }
};

В качестве побочного элемента вы можете увидеть множество страниц, предлагающих использовать пустой обработчик onunload в качестве решения. Это не сработало с iOS5.

$(window).bind("unload", function() { });