Latar Belakang: Saya sedang melakukan beberapa tes antarmuka pengguna yang perlu mendeteksi apakah orang memperhatikan atau tidak. Tapi, pertanyaan ini bukan tentang API visibilitas halaman .
Secara khusus, saya ingin tahu bagaimana kode Javascript saya akan terpengaruh jika tab saat ini tidak aktif, atau jendela browser tidak aktif, di browser yang berbeda. Saya telah menggali yang berikut ini sejauh ini:
- ios 5 menjeda javascript saat tab tidak aktif
setInterval
dansetTimeout
penundaan berkurang ketika tab tidak aktif - sepertinya ini baru saja mulai muncul baru-baru ini dan dapat mengacaukan tes unit Jasmine, di sekitar hal-hal lain.requestAnimationFrame
diperlambat ketika tab tidak aktif (masuk akal, tidak bisa memikirkan mengapa hal ini mempengaruhi terlalu banyak orang)
Saya punya pertanyaan berikut:
- Selain peramban seluler, apakah peramban desktop pernah menghentikan eksekusi JS ketika sebuah tab tidak aktif? Kapan dan browser apa?
- Browser mana yang mengurangi
setInterval
pengulangan? Apakah hanya dikurangi menjadi batas atau persentase? Sebagai contoh, jika saya memiliki 10ms repeat versus repeat 5000ms, bagaimana masing-masing akan terpengaruh? - Apakah perubahan ini terjadi jika jendela tidak fokus, bukan hanya tab? (Saya membayangkan akan lebih sulit untuk dideteksi, karena membutuhkan OS API.)
- Apakah ada efek lain yang tidak akan diamati pada tab aktif? Bisakah mereka mengacaukan hal-hal yang seharusnya dilakukan dengan benar (yaitu tes Jasmine yang disebutkan sebelumnya)?
javascript
browser
Andrew Mao
sumber
sumber
setInterval
/setTimeout
kali di bawah 1000ms diubah menjadi 1000ms ketika tab / jendela buramsetInterval
/setTimeout
waktu di bawah 1000ms diubah menjadi 1000ms ketika tab / jendela kabur. Tidak jelas apa yang Anda coba sampaikanJawaban:
Tes Satu
Saya telah menulis tes khusus untuk tujuan ini:
Distribusi Frame Rate: setInterval vs requestAnimationFrame
Catatan: Tes ini cukup intensif CPU.
requestAnimationFrame
tidak didukung oleh IE 9- dan Opera 12-.Tes mencatat waktu aktual yang diperlukan untuk
setInterval
danrequestAnimationFrame
menjalankan di berbagai browser, dan memberi Anda hasil dalam bentuk distribusi. Anda dapat mengubah jumlah milidetik untuksetInterval
melihat cara kerjanya di bawah pengaturan yang berbeda.setTimeout
bekerja miripsetInterval
dengan sehubungan dengan penundaan.requestAnimationFrame
umumnya default ke 60fps tergantung pada browser. Untuk melihat apa yang terjadi ketika Anda beralih ke tab lain atau memiliki jendela tidak aktif, cukup buka halaman, beralih ke tab lain dan tunggu sebentar. Ini akan terus mencatat waktu aktual yang diperlukan untuk fungsi-fungsi ini di tab tidak aktif.Tes Dua
Cara lain untuk menguji itu adalah untuk log timestamp berulang kali dengan
setInterval
danrequestAnimationFrame
dan melihatnya di konsol terpisah. Anda dapat melihat seberapa sering itu diperbarui (atau jika pernah diperbarui) ketika Anda membuat tab atau jendela tidak aktif.setInterval
requestAnimationFrame
Hasil
Chrome
Chrome membatasi interval minimum
setInterval
hingga sekitar 1000 ms ketika tab tidak aktif. Jika interval lebih tinggi dari 1000ms, itu akan berjalan pada interval yang ditentukan. Tidak masalah jika jendela tidak fokus, intervalnya dibatasi hanya ketika Anda beralih ke tab lain.requestAnimationFrame
dijeda ketika tab tidak aktif.https://codereview.chromium.org/6546021/patch/1001/2001
Firefox
Mirip dengan Chrome, Firefox membatasi interval minimum
setInterval
hingga sekitar 1000 ms ketika tab (bukan jendela) tidak aktif. Namun,requestAnimationFrame
berjalan lebih lambat secara eksponensial ketika tab tidak aktif, dengan setiap frame mengambil 1s, 2s, 4s, 8s, dan seterusnya.https://hg.mozilla.org/releases/mozilla-release/file/0bf1cadfb004/dom/base/nsGlobalWindow.cpp#l296
Internet Explorer
IE tidak membatasi penundaan
setInterval
ketika tab tidak aktif, tetapi berhentirequestAnimationFrame
di tab tidak aktif. Tidak masalah apakah jendela itu tidak fokus atau tidak.Edge
Mulai dari Edge 14,
setInterval
dibatasi pada 1000ms dalam tab tidak aktif.requestAnimationFrame
selalu dijeda dalam tab tidak aktif.Safari
Sama seperti Chrome, Safari tutup
setInterval
pada 1000 ms saat tab tidak aktif.requestAnimationFrame
dijeda juga.Opera
Sejak adopsi mesin Webkit, Opera menunjukkan perilaku yang sama seperti Chrome.
setInterval
dibatasi pada 1000 ms danrequestAnimationFrame
dijeda ketika tab tidak aktif.Ringkasan
Interval berulang untuk tab tidak aktif:
sumber
setInterval
danrequestAnimationFrame
?setInterval
danrequestAnimationFrame
. Hal yang saya tahu adalah bahwasetTimeout
berperilaku serupasetInterval
, dalam bahwa mereka berdua memiliki interval latar belakang minimum yang sama di Firefox dan Chrome, dan tidak ada batas yang jelas di browser lain.about:config
di browser dan mengubahdom.min_background_timeout_value
nilainya menjadi lebih dari 1000.requestAnimationFrame
panggilan jika pengguna hanya mengganti aplikasi (Alt + Tab keluar dari Chrome). Selama tab aktif di Chrome, "frame rate" lebih atau kurang konstan.Apa yang saya amati: pada tab tidak aktif di Chrome , semua Anda
setTimeout
(harus samasetInterval
) menunggu kurang dari 1000ms dibulatkan menjadi 1000ms . Saya pikir batas waktu yang lebih lama tidak dimodifikasi.Tampaknya menjadi perilaku sejak Chrome 11 dan Firefox 5.0 : https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#Inactive_tabs
Lebih jauh, saya tidak berpikir itu berlaku seperti ini ketika seluruh jendela tidak aktif (tetapi tampaknya cukup mudah untuk diselidiki).
sumber
focus
danblur
acara tampaknya mendeteksi kedua tab dan switch jendela, sehingga bisa bekerja dua arah. Tapi saya bertanya-tanya bagaimana jendela mendeteksi apakah itu benar-benar terlihat atau tidak.Jawaban yang lebih baru untuk melengkapi ini: pada chrome 78.0.3904.108 Saya perhatikan semua timeout ini (bukan hanya yang di bawah 1000 ms ) membutuhkan waktu sedikit lebih lama dari yang diharapkan ketika saya pindah ke tab yang berbeda, dan kemudian kembali. Perilaku yang saya lihat lebih tepat dideskripsikan sebagai "Semua timeout pada tab yang tidak aktif dapat ditunda dengan sejumlah tambahan, hingga maksimum 1000 ms." :
sumber