Фон: я делаю некоторые тесты пользовательского интерфейса, которые должны определить, обращают ли люди внимание или нет. Но этот вопрос не об API видимости страницы .
В частности, я хотел бы знать, как повлияет мой код Javascript, если текущая вкладка не активна или окно браузера не активно в разных браузерах. До сих пор я выкопал следующее:
- IOS 5 паузы JavaScript, когда вкладка не активна
setInterval
иsetTimeout
задержка уменьшается, когда вкладки не активны - кажется, что это только начало появляться недавно и может испортить юнит-тесты Жасмин, вокруг других вещей.requestAnimationFrame
замедляется, когда вкладка не активна (разумно, не могу понять, почему это слишком сильно повлияет на кого-либо)
У меня есть следующие вопросы:
- Кроме мобильных браузеров, настольные браузеры когда-нибудь приостанавливают выполнение JS, когда вкладка не активна? Когда и какие браузеры?
- Какие браузеры уменьшают
setInterval
повтор? Это просто уменьшено до предела или в процентах? Например, если у меня будет повторение 10 мс против повторения 5000 мс, как это повлияет на каждый? - Происходят ли эти изменения, если окно не в фокусе, а не только вкладка? (Я полагаю, это будет сложнее обнаружить, так как для этого требуется ОС API.)
- Существуют ли какие-либо другие эффекты, которые не наблюдались бы в активной вкладке? Могут ли они испортить вещи, которые в противном случае выполнялись бы правильно (например, вышеупомянутые тесты Жасмин)?
javascript
browser
Эндрю Мао
источник
источник
setInterval
/setTimeout
времена под 1000 мс меняются на 1000 мс, когда вкладка / окно размытыsetInterval
/setTimeout
times до 1000 мс изменяются на 1000 мс, когда вкладка / окно размыты. Непонятно, что вы пытались передатьОтветы:
Тест Один
Я написал тест специально для этой цели:
Распределение частоты кадров: setInterval vs requestAnimationFrame
Примечание. Этот тест требует значительных ресурсов процессора.
requestAnimationFrame
не поддерживается IE 9- и Opera 12-.Тест регистрирует фактическое время, необходимое для выполнения
setInterval
иrequestAnimationFrame
в разных браузерах, и выдает результаты в виде дистрибутива. Вы можете изменить количество миллисекунд,setInterval
чтобы увидеть, как он работает при разных настройках.setTimeout
работает аналогично a вsetInterval
отношении задержек.requestAnimationFrame
как правило, по умолчанию 60fps в зависимости от браузера. Чтобы увидеть, что происходит, когда вы переключаетесь на другую вкладку или у вас неактивное окно, просто откройте страницу, переключитесь на другую вкладку и подождите некоторое время. Он продолжит регистрировать фактическое время, необходимое для этих функций, на неактивной вкладке.Тест Два
Другой способ проверить это состоит в том, чтобы периодически регистрировать метку времени
setInterval
иrequestAnimationFrame
просматривать ее на отдельной консоли. Вы можете видеть, как часто оно обновляется (или обновляется) когда вы делаете вкладку или окно неактивными.setInterval
requestAnimationFrame
Полученные результаты
Chrome
Chrome ограничивает минимальный интервал
setInterval
до 1000 мс, когда вкладка неактивна. Если интервал превышает 1000 мс, он будет работать с указанным интервалом. Неважно, если окно не в фокусе, интервал ограничен только при переключении на другую вкладку.requestAnimationFrame
Пауза, когда вкладка неактивна.https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
Аналогично Chrome, Firefox ограничивает минимальный интервал
setInterval
до 1000 мс, когда вкладка (не окно) неактивна. Однако,requestAnimationFrame
когда вкладка неактивна , она работает экспоненциально медленнее, каждый кадр занимает 1 с, 2 с, 4 с, 8 с и т. Д.https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE не ограничивает задержку,
setInterval
когда вкладка неактивна, но делает паузуrequestAnimationFrame
в неактивных вкладках. Неважно, не в фокусе ли окно.Edge
Начиная с Edge 14,
setInterval
ограничивается 1000 мс в неактивных вкладках.requestAnimationFrame
всегда приостанавливается в неактивных вкладках.Safari
Как и Chrome, Safari ограничивается
setInterval
1000 мс, когда вкладка неактивна.requestAnimationFrame
также приостановленOpera
С момента принятия движка Webkit Opera демонстрирует то же поведение, что и Chrome.
setInterval
ограничивается 1000 мс иrequestAnimationFrame
приостанавливается, когда вкладка неактивна.Резюме
Повторяющиеся интервалы для неактивных вкладок:
источник
setInterval
иrequestAnimationFrame
?setInterval
иrequestAnimationFrame
. То, о чем я знаю, это то , что они ведутsetTimeout
себя аналогичноsetInterval
, поскольку у них обоих одинаковый минимальный фоновый интервал в Firefox и Chrome, а в других браузерах нет видимых ограничений.about:config
в браузере и изменивdom.min_background_timeout_value
значение на значение, отличное от 1000.requestAnimationFrame
вызова, если пользователь просто переключает приложение (Alt + Tab из Chrome). Пока вкладка активна в Chrome, «частота кадров» более или менее постоянна.Что я заметил: на неактивных вкладках в Chrome все ваши
setTimeout
(должны быть одинаковымиsetInterval
) ожидания менее 1000 мс округляются до 1000 мс . Я думаю, что более длительные тайм-ауты не изменены.Похоже, что поведение с Chrome 11 и Firefox 5.0 : https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#Inactive_tabs
Кроме того, я не думаю, что это ведет себя так, когда все окно неактивно (но это довольно легко исследовать).
источник
focus
иblur
события обнаруживают как переключатели вкладок, так и окон, поэтому он может работать в обоих направлениях. Но мне интересно, как окно определяет, действительно ли оно видно или нет.Более новый ответ, дополняющий их: в chrome 78.0.3904.108 я замечаю, что все эти таймауты (не только те, что ниже 1000 мс) занимают немного больше времени, чем ожидалось, когда я перехожу на другую вкладку, а затем возвращаюсь. Поведение, которое я вижу, более правильно описывается как «Все тайм-ауты на неактивных вкладках могут быть задержаны на некоторую дополнительную сумму, максимум до 1000 мс». :
источник