<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這是我最近開發碰到的一個問題,本文是我測試出來的實踐結果,供大家參考。
關於js定時器,setInterval和setTimeout,作為我們日常開發經常使用到的方法,大家一定非常熟悉。比如下面一個例子:
setInterval(() => { console.log('1'); }, 500);
作為剛學前端沒多久的新人也能知道,這段程式碼就是每過500ms列印一次1(實際執行還需要考慮js的宏任務和微任務的執行時間,定時器的間隔時間是500ms,但是定時器中的方法觸發可能需要在宏任務佇列中排隊,不一定會在500ms的時候觸發,關於Event Loop的基礎內容不在本文討論之內)。
但是如果你把瀏覽器從當前頁面切換到另一個分頁,或者把瀏覽器最小化了,這時候,這個頁面定時器的間隔時間還是500ms?
本文將測試setInterval、setTimeout、requestAnimationFrame這三個方法在瀏覽器可見以及不可見狀態下的表現,我的測試瀏覽器以及版本是谷歌(86.0.4240.193),火狐(81.0.2),ie11。
瀏覽器的可見和不可見狀態的切換會觸發visibilitychange事件,我們可以通過監聽這個事件來判別瀏覽器的可見狀態。
document.addEventListener("visibilitychange", function() { console.log(document.visibilityState); });
document.visibilityState有三個值
關於visibilitychange的細節可以看阮一峰老師的這篇文章 Page Visibility API 教學。
我們先來測試setInterval,程式碼如下
<button id="btn">開始計時</button> // 相容ie寫法 document.getElementById('btn').addEventListener('click', function() { setInterval(function() { const myDate = new Date(); const currentDate = myDate.getMinutes() + '分'+ myDate.getSeconds() + '秒' + myDate.getMilliseconds() + '豪秒'; // 每次迴圈列印當前時間 console.log(currentDate); }, 500); }); // 瀏覽器可見狀態切換事件 document.addEventListener('visibilitychange', function() { if(document.hidden) { console.log('頁面不可見'); } });
定時器間隔是500ms,先來看下谷歌瀏覽器
我們發現,當頁面不可見之後,定時器的間隔變成了1s。 接下來,我們把定時器間隔改成2s來試下。
前後間隔時間一致。
接下來測試一下火狐和ie。這裡列出的圖片都是500ms和2s的例子。
ie瀏覽器
經過我大量的測試,可以得出結論,谷歌瀏覽器中,當頁面處於不可見狀態時,setInterval的最小間隔時間會被限制為1s。火狐瀏覽器的setInterval和谷歌特性一致,但是ie瀏覽器沒有對不可見狀態時的setInterval進行效能優化,不可見前後間隔時間不變。
接下來是setTimeout
function timer() { setTimeout(function() { const myDate = new Date(); const currentDate = myDate.getMinutes() + '分'+ myDate.getSeconds() + '秒' + myDate.getMilliseconds() + '豪秒'; console.log(currentDate); timer(); }, 500) } // 相容ie寫法 document.getElementById('btn').addEventListener('click', function() { timer(); });
同樣先來看看在谷歌瀏覽器中的表現(還是500ms和2s)
我們發現在谷歌瀏覽器中,500ms的間隔,setTimeout和setInterval表現一致,都是最小間隔限制為1s。但是2s隔間的測試結果出現了分歧,頁面不可見之後,間隔變成了3s。繼續經過多次的測試,如下,左圖的間隔時間為990ms,右圖的間隔時間為1s。
不可見狀態下,左圖中的990ms間隔時間變為1s,右圖中的1s間隔時間變為2s。
我們再來看看火狐(500ms和2s)
火狐瀏覽器不可見狀態下,左圖中的500ms變為1s,右圖中的2s保持不變。
再來看看ie瀏覽器(500ms)
一樣毫無優化。
我們可以得出結論
raf是瀏覽器提供的一個更流暢的處理動畫的方法,它會在下次瀏覽器GUI繪製頁面的時候執行傳入的方法。GUI繪製頁面的頻率跟顯示器的重新整理率有關,普通顯示器的重新整理率是60hz,因此raf在一秒之內需要執行60次,間隔四捨五入大概是17ms。
function timer() { const myDate = new Date(); const currentDate = myDate.getMinutes() + '分'+ myDate.getSeconds() + '秒' + myDate.getMilliseconds() + '豪秒'; console.log(currentDate); window.requestAnimationFrame(timer) } // 相容ie寫法 document.getElementById('btn').addEventListener('click', function() { timer(); });
我們來看看不同瀏覽器下面的表現:
谷歌瀏覽器
火狐瀏覽器
ie瀏覽器
我們可以發現,谷歌瀏覽器和ie瀏覽器當瀏覽器狀態為不可見時,raf方法將停止執行。火狐瀏覽器當狀態變為不可見時,會在間隔是1s,2s,4s,8s,16s,32s...這樣的順序下去執行raf方法。
谷歌瀏覽器中,當頁面處於不可見狀態時,setInterval的最小間隔時間會被限制為1s。火狐瀏覽器的setInterval和谷歌特性一致。ie瀏覽器沒有對不可見狀態時的setInterval進行效能優化,不可見前後間隔時間不變。
在谷歌瀏覽器中,setTimeout在瀏覽器不可見狀態下間隔低於1s的會變為1s,大於等於1s的會變成N+1s的間隔值。火狐瀏覽器下setTimeout的最小間隔時間會變為1s,大於等於1s的間隔不變。ie瀏覽器在不可見狀態前後的間隔時間不變。
谷歌瀏覽器和ie瀏覽器當瀏覽器狀態為不可見時,raf方法將停止執行。火狐瀏覽器當狀態變為不可見時,會在間隔是1s,2s,4s,8s,16s,32s...這樣的順序下去執行raf方法。
碰到問題當然需要解決,在一些定時器小於1s的倒計時的頁面中,如果使用者切換到了其他分頁。再切回去的時候,頁面上顯示的倒計時時間其實是錯誤的,這種隱藏的bug會帶來很大的風險。該怎麼解決呢?
除了調取後臺介面或者websocket連線之外,其實有一個更好的解決方案,webWorkers。而且webWorkers還可以解決一個頁面存在多個定時器時候間隔時間誤差較大的問題。
直接上例子
document.getElementById('btn').addEventListener('click', function() { var w = new Worker('demo_workers.js'); w.onmessage = function(event){ console.log(event.data); }; }); //瀏覽器切換事件 document.addEventListener('visibilitychange', function() { if(document.hidden) { console.log('頁面不可見'); } });
// demo_workers.js setInterval(function() { const myDate = new Date(); const currentDate = myDate.getMinutes() + '分'+ myDate.getSeconds() + '秒' + myDate.getMilliseconds() + '豪秒'; postMessage(currentDate); }, 500);
實際結果
間隔保持一致。
以上就是瀏覽器切換到其他分頁或最小化js定時器是否準時測試的詳細內容,更多關於瀏覽器切換js定時器準時測試的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45