不会停下的setInterval

作者: Againster | 来源:发表于2017-12-09 23:56 被阅读0次

    关于定时器,如果把浏览器最小化或者看其他页面的时候,页面都会处于未激活状态,也就是对于chrome定时器会变1s运行一次,手机定时器则会直接暂停。

    比如运行如下代码,页面切到后台的话,定时器chrome会变一秒变一次,手机则会暂停。关于定时器,如果把浏览器最小化或者看其他页面的时候,页面都会处于未激活状态,也就是对于chrome定时器会变1s运行一次,手机定时器则会直接暂停。

    比如运行如下代码,页面切到后台的话,setInterval定时器在chrome中会变一秒变一次,手机则会暂停。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test js</title>
    </head>
    <body>
        <script type="text/javascript">
            var time=0;
            setInterval(function(){
                time++;
                document.write(time+" ");
                document.title=time+" ";
            },100);
        </script>
    </body>
    </html>
    

    然后先尝试一个web worker实现的不停下的setInterval,类似于让定时器部分js在后台运行,这样就可以一直运行定时器,前台收到msg展示即可。下面是html部分

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <script type="text/javascript">
            var worker = new Worker("worker.js");
    
            // 向worker.js发送信息
            worker.postMessage( 'hello world' );
    
            // 接收从worker.js发送的信息,存储在event.data中
            worker.onmessage = function(event){
                document.write(event.data+" ");
                document.title=event.data+" ";
            }
        </script>
    </body>
    </html>
    

    下面是web worker的js部分。

    onmessage = function(event){
        var data = event.data;
        var time=0;
        setInterval(function(){
            // 向前端页面发送信息
            postMessage(time);
            time++;
        }, 100)
    }
    

    再来一种比较奇妙的实现,主要参考这里

    通过mate的refresh和setInterval的配合实现。不过这个好像最小只能实现一秒。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="refresh" content="2" id="refresh">
        <title>123</title>
    </head>
    <body>
        <script type="text/javascript">
            var meta = document.getElementById("refresh");
            var time = 0;
            setInterval(function() {
                meta.content = meta.content;
                document.title=time+" ";
                document.write(time+" ");
                time++;
            }, parseInt(meta.content / 2) * 1000);
        </script>
    </body>
    </html>
    

    最后再扯扯这个问题的初衷,一次面试被问到页面定时器显示时间由于会停止,后台运行(最小化)后回来时间不对了怎么办。

    这个容易调入上面的陷阱,想着怎么让定时器持续运行,其实只要setInterval获取系统时间便可以。即使停了回来也会运行一次获取到系统时间。代码如下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>time</title>
    </head>
    <body>
        <div id="time"></div>
        <script type="text/javascript">
            setInterval(function(){
                document.getElementById("time").innerHTML=new Date().toString();
            },1000);
        </script>
    </body>
    </html>
    

    That's all;

    相关文章

      网友评论

        本文标题:不会停下的setInterval

        本文链接:https://www.haomeiwen.com/subject/iwcmixtx.html