Неожиданное поведение setTimeout в Safari 4.0.4 - PullRequest
4 голосов
/ 18 января 2010

Такое поведение наблюдается только в последней версии Safari (4.0.4).Используя приведенный ниже пример, страница создаст окно предупреждения через 60 минут.Если вы откроете следующую страницу, нажмете ссылку на Google и нажмете кнопку «Назад» вашего браузера, ничего не произойдет.Это работает, как ожидалось.

Однако, если я открою следующую страницу в Safari, щелкните по ссылке, а затем нажмите кнопку «Назад», сразу же появится окно с предупреждением.Кажется, это происходит только с первой попытки и не произойдет снова, пока я не выполню полное обновление или не закрою Safari.

Ожидается ли это?

1 Ответ

4 голосов
/ 18 января 2010

Хорошее место! Подтверждено.

Это связано с кешем кнопок назад / вперед. Когда вы покидаете страницу в Firefox или Safari (но не в Chrome), она сохраняет старую страницу загруженной, просто скрытой. Если вы нажмете «назад», он сможет снова отобразить страницу без необходимости ее повторного анализа и повторного запуска всего JavaScript, что приведет к гораздо более быстрой навигации (особенно полезно для страниц, которые начинают загружать вещи через загрузку AJAX).

В Firefox время срабатывания тайм-аута сохраняется, поэтому, если до истечения времени ожидания у вас есть пять секунд, покиньте страницу, подождите три секунды и вернитесь, время ожидания сработает еще через две секунды. Если время ожидания истекло бы, пока вы отсутствовали на странице, оно сработает немедленно, когда вы вернетесь. Похоже, что Safari в настоящее время запускает каждые оставшиеся тайм-ауты по возвращении на страницу, а не только те, которые были запланированы для запуска в прошлом. На мой взгляд, это ошибка. Хотите сообщить об этом или я?

Вы можете обойти это, заставив функцию тайм-аута проверить реальное время с помощью new Date().getTime(), прежде чем предпринимать какие-либо действия. Это иногда полезно для некоторых видов тайм-аута, так как время обратного вызова может отклоняться назад из-за того, что браузер занят или страница скрыта от bfcache. Но из-за этой ошибки теперь он тоже может двигаться вперед. К сожалению, кажется, что Safari также не реализует функцию onpagehide, которую Firefox представил для работы с bfcache, поэтому вы не можете это уловить.

Другим вариантом было бы прослушивание браузера для Safari и, если он найден, отключение bfcache путем установки функции window.onunload - даже той, которая ничего не делает. Firefox и Safari воспринимают это как сигнал о том, что страница действительно должна быть выгружена при выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...