Хорошее место! Подтверждено.
Это связано с кешем кнопок назад / вперед. Когда вы покидаете страницу в Firefox или Safari (но не в Chrome), она сохраняет старую страницу загруженной, просто скрытой. Если вы нажмете «назад», он сможет снова отобразить страницу без необходимости ее повторного анализа и повторного запуска всего JavaScript, что приведет к гораздо более быстрой навигации (особенно полезно для страниц, которые начинают загружать вещи через загрузку AJAX).
В Firefox время срабатывания тайм-аута сохраняется, поэтому, если до истечения времени ожидания у вас есть пять секунд, покиньте страницу, подождите три секунды и вернитесь, время ожидания сработает еще через две секунды. Если время ожидания истекло бы, пока вы отсутствовали на странице, оно сработает немедленно, когда вы вернетесь. Похоже, что Safari в настоящее время запускает каждые оставшиеся тайм-ауты по возвращении на страницу, а не только те, которые были запланированы для запуска в прошлом. На мой взгляд, это ошибка. Хотите сообщить об этом или я?
Вы можете обойти это, заставив функцию тайм-аута проверить реальное время с помощью new Date().getTime()
, прежде чем предпринимать какие-либо действия. Это иногда полезно для некоторых видов тайм-аута, так как время обратного вызова может отклоняться назад из-за того, что браузер занят или страница скрыта от bfcache. Но из-за этой ошибки теперь он тоже может двигаться вперед. К сожалению, кажется, что Safari также не реализует функцию onpagehide
, которую Firefox представил для работы с bfcache, поэтому вы не можете это уловить.
Другим вариантом было бы прослушивание браузера для Safari и, если он найден, отключение bfcache путем установки функции window.onunload
- даже той, которая ничего не делает. Firefox и Safari воспринимают это как сигнал о том, что страница действительно должна быть выгружена при выходе.