Kontekst: Przeprowadzam testy interfejsu użytkownika, które muszą wykryć, czy ludzie zwracają na to uwagę, czy nie. Ale to pytanie nie dotyczy interfejsu API widoczności strony .
W szczególności chciałbym wiedzieć, jak wpłynie to na mój kod JavaScript, jeśli bieżąca karta nie jest aktywna lub okno przeglądarki nie jest aktywne w różnych przeglądarkach. Do tej pory wykopałem:
- ios 5 zatrzymuje javascript, gdy karta nie jest aktywna
setInterval
asetTimeout
opóźnienie jest zmniejszone, gdy zakładki nie są aktywne - wydaje się, że to właśnie zaczęło się pojawiać niedawno i może zepsuć testy jednostkowe Jasmine, wokół innych rzeczy.requestAnimationFrame
jest spowolniony, gdy karta nie jest aktywna (rozsądne, nie mogę sobie wyobrazić, dlaczego miałoby to na kogokolwiek zbyt duży wpływ)
Mam następujące pytania:
- Czy inne niż przeglądarki mobilne przeglądarki komputerowe wstrzymują wykonywanie JS, gdy karta nie jest aktywna? Kiedy i jakie przeglądarki?
- Które przeglądarki zmniejszają liczbę
setInterval
powtórzeń? Czy to tylko ograniczenie, czy procent? Na przykład, jeśli mam powtórzenie 10 ms w porównaniu z powtórzeniem 5000 ms, jak to wpłynie na każdy z nich? - Czy te zmiany zachodzą, gdy okno jest nieostre, a nie tylko karta? (Wyobrażam sobie, że byłoby to trudniejsze do wykrycia, ponieważ wymaga interfejsu API systemu operacyjnego).
- Czy są jakieś inne efekty, których nie byłoby widać na aktywnej karcie? Czy mogliby zepsuć rzeczy, które w przeciwnym razie działałyby poprawnie (tj. Wspomniane wyżej testy Jasmine)?
javascript
browser
Andrew Mao
źródło
źródło
setInterval
/setTimeout
czasy poniżej 1000 ms są zmieniane na 1000 ms, gdy karta / okno jest rozmytesetInterval
/setTimeout
czasy poniżej 1000 ms są zmieniane na 1000 ms, gdy karta / okno jest rozmyte. Nie jest jasne, co próbowałeś przekazaćOdpowiedzi:
Test One
Napisałem test specjalnie w tym celu:
Frame Rate Distribution: setInterval vs requestAnimationFrame
Uwaga: ten test mocno obciąża procesor.
requestAnimationFrame
nie jest obsługiwany przez IE 9- i Opera 12-.Test rejestruje rzeczywisty czas potrzebny na uruchomienie
setInterval
a irequestAnimationFrame
w różnych przeglądarkach i przedstawia wyniki w postaci dystrybucji. Możesz zmienić liczbę milisekund,setInterval
aby zobaczyć, jak działa przy różnych ustawieniach.setTimeout
działa podobnie jak asetInterval
w odniesieniu do opóźnień.requestAnimationFrame
zwykle domyślnie wynosi 60 klatek na sekundę, w zależności od przeglądarki. Aby zobaczyć, co się stanie, gdy przełączysz się na inną kartę lub masz nieaktywne okno, po prostu otwórz stronę, przełącz się na inną kartę i poczekaj chwilę. Będzie nadal rejestrował rzeczywisty czas potrzebny na te funkcje na nieaktywnej karcie.Test drugi
Innym sposobem przetestowania tego jest wielokrotne rejestrowanie znacznika czasu za pomocą
setInterval
irequestAnimationFrame
i przeglądanie go w odłączonej konsoli. Możesz zobaczyć, jak często jest aktualizowany (lub czy kiedykolwiek jest aktualizowany), gdy wyłączysz kartę lub okno.setInterval
requestAnimationFrame
Wyniki
Chrome
Chrome ogranicza minimalny interwał
setInterval
do około 1000 ms, gdy karta jest nieaktywna. Jeśli interwał jest dłuższy niż 1000 ms, będzie działał z określonym interwałem. Nie ma znaczenia, czy okno jest nieostre, interwał jest ograniczony tylko wtedy, gdy przełączysz się na inną kartę.requestAnimationFrame
jest wstrzymywany, gdy karta jest nieaktywna.https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
Podobnie jak Chrome, Firefox ogranicza minimalny interwał
setInterval
do około 1000 ms, gdy karta (nie okno) jest nieaktywna. JednakrequestAnimationFrame
działa wykładniczo wolniej, gdy karta jest nieaktywna, a każda klatka zajmuje 1s, 2s, 4s, 8s i tak dalej.https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE nie ogranicza opóźnienia,
setInterval
gdy karta jest nieaktywna, ale zatrzymuje sięrequestAnimationFrame
na nieaktywnych kartach. Nie ma znaczenia, czy okno jest nieostre, czy nie.Krawędź
Począwszy od krawędzi 14,
setInterval
jest ograniczona do 1000 ms w nieaktywnych zakładkach.requestAnimationFrame
jest zawsze wstrzymywany w nieaktywnych kartach.Safari
Podobnie jak Chrome, Safari ogranicza czas
setInterval
do 1000 ms, gdy karta jest nieaktywna.requestAnimationFrame
jest również wstrzymana.Opera
Od czasu przyjęcia silnika Webkit Opera zachowuje się tak samo jak Chrome.
setInterval
jest ograniczony do 1000 ms irequestAnimationFrame
jest wstrzymywany, gdy karta jest nieaktywna.Podsumowanie
Powtarzanie odstępów czasu dla nieaktywnych kart:
źródło
setInterval
irequestAnimationFrame
?setInterval
irequestAnimationFrame
. Wiem o tym, żesetTimeout
zachowuje się podobnie do tegosetInterval
, że oba mają ten sam minimalny interwał tła w Firefoksie i Chrome i nie mają widocznego ograniczenia w innych przeglądarkach.about:config
w przeglądarce i zmieniającdom.min_background_timeout_value
wartość na inną niż 1000.requestAnimationFrame
wywołania, jeśli użytkownik po prostu przełączy aplikację (Alt + Tab poza Chrome). Dopóki karta jest aktywna w Chrome, „liczba klatek na sekundę” jest mniej więcej stała.Co zaobserwowałem: na nieaktywnych kartach w Chrome wszystkie twoje
setTimeout
(musi być takie samosetInterval
) czekanie mniej niż 1000 ms są zaokrąglane do 1000 ms . Myślę, że dłuższe limity czasu nie są modyfikowane.Wygląda na to, że zachowuje się tak od wersji Chrome 11 i Firefox 5.0 : https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#Inactive_tabs
Co więcej, nie sądzę, aby zachowywał się w ten sposób, gdy całe okno jest nieaktywne (ale wydaje się dość łatwe do zbadania).
źródło
focus
iblur
zdarzenia wykrywają zarówno przełączniki kart, jak i okien, więc może działać w obie strony. Ale zastanawiam się, jak okno wykrywa, czy jest rzeczywiście widoczne, czy nie.Nowsza odpowiedź uzupełniająca te: na chrome 78.0.3904.108 zauważam, że wszystkie te limity czasu (nie tylko te poniżej 1000 ms ) trwają nieco dłużej niż oczekiwano, gdy przechodzę do innej karty, a potem wracam. Zachowanie, które widzę, jest dokładniej opisane jako „Wszystkie limity czasu na nieaktywnych kartach mogą być opóźnione o dodatkową wartość, do maksymalnie 1000 ms”. :
źródło