教你用JS手寫簡單的秒錶(精確到10ms,沒有延遲)

製做秒錶的思路以下:javascript

一、首先定出功能以及界面。css

個人目的是作最簡單的秒錶,所以只須要開始、結束以及清零的功能。界面以下圖所示:html

未開始運行:前端

運行中:  java

二、構思實現的方式。學習

首先,核心方法確定是 setInterval() 方法,用於週期性地顯示時間。 由於我要精確到10ms, 因此設置時間間隔爲10。spa

再者,如何令時間遞增?設計

A . 我開始想到的是設置變量 milliSeconds、seconds、minutes 以及 hours 。milliSeconds每10ms遞增1, 當 milliSeconds >= 100 時,用milliSeconds模100,同時seconds增1 。同理,seconds 滿60時 minutes 遞增1 ,minutes 滿 60 時 hours 遞增1。code

可是,爲了保證格式的統一性(我想要顯示 02:01:24:06,而不是顯示 2:1:24:6),因而又將四個變量變爲8個變量,思想同上。(代碼參見本頁最後 「有延時的秒錶」)。htm

不過,在運行的時候出現了延遲問題,而且該延遲還會進行累加。在時間較短時還能比較準確地運行,時間一長,秒錶上的時間就會和標準時間偏差比較大。

B . 爲了讓延遲減少,我又設計了另一種方法(實際上這種方法延遲比上一種更高)。此時只用一個time變量,來記錄觸發 start 按鈕之後所通過的毫秒數(time以10ms爲單位,下面的a/b/c/d表示毫秒(10ms)、秒、分、時)。爲了追求格式的統一性,我加入了 if 語句,當a/b/c/d小於10時,前面添加 0 佔位。

                var a=time%100;
                var b=time%6000/100;
                var c=time%360000/6000;
                var d=time%8640000/360000;

將方案A與B比較。因爲A用了嵌套的形式來計算時間,在時間較短時,方案A判斷的次數較少,效率較高;而對於方案B來講,每次循環必然要通過四次計算,所以,在時間較短時, 效率甚至比A還低。

C . 爲了與真實時間同步,不產生任何偏差,我又想到了另外一種方式。在JS的Date對象裏面,有一個方法叫作 getTime(), 用於返回 1970 年 1 月 1 日至今的毫秒數。在點擊start時,觸發 getTime() ,以此時間做爲基準,每十毫秒執行一次  getTime() ,讓後者減去前者獲得相對時間。這樣一來,就完美解決了與真實時間同步的問題。

下面附上三段代碼:

###代碼A

<!Doctype html>
<html>
    <head>
        <title>有延遲的秒錶</title>
        <style type="text/css"></style>        
    </head>
    <body>
        <div id="div1">
            <span id="span10">0</span><span id="span11">0</span> :
            <span id="span20">0</span><span id="span21">0</span> :
            <span id="span30">0</span><span id="span31">0</span> :
            <span id="span40">0</span><span id="span41">0</span>
        </div>
        <input id="input1" type="button" value="start" onclick="whenClick();">
        <input id="input2" type="button" value="clear" onclick="clear1();">
        <script  type="text/javascript">
            var milliSeconds1 = document.getElementById("span41");
            var milliSeconds0 = document.getElementById("span40");
            var seconds1 = document.getElementById("span31");
            var seconds0 = document.getElementById("span30");
            var minutes1 = document.getElementById("span21");
            var minutes0 = document.getElementById("span20");//前端全棧交流學習圈:866109386
            var hours1 = document.getElementById("span11");   //面相1-3年經驗前端開發人員
            var hours0 = document.getElementById("span10");  //幫助突破技術瓶頸,提高思惟能力
            var flag;

            function whenClick(){//  開始/暫停
                var inputValue = document.getElementById("input1");
                if(inputValue.value=="start"||inputValue.value=="continue"){
                    inputValue.value=" stop";
                    start1();
                }
                else {
                    inputValue.value="continue";
                    stop1();
                }
            }
            
            function clear1(){//  清零
                stop1();
                milliSeconds1.innerHTML = milliSeconds0.innerHTML = 
                seconds1.innerHTML = seconds0.innerHTML = minutes1.innerHTML = 
                minutes0.innerHTML = hours1.innerHTML = hours0.innerHTML = 0;
                document.getElementById("input1").value = "start";
            }

            function start1(){//  開始/繼續
                flag = setInterval("timeIncrement();",10);
            }

            function timeIncrement(){
                milliSeconds1.innerHTML++;
                if(milliSeconds1.innerHTML>=10){
                    milliSeconds1.innerHTML%=10;
                    milliSeconds0.innerHTML++;
                    if(milliSeconds0.innerHTML>=10){
                        milliSeconds0.innerHTML%=10;
                        seconds1.innerHTML++;
                        if(seconds1.innerHTML>=10){
                            seconds1.innerHTML%=10;
                            seconds0.innerHTML++;
                            if(seconds0.innerHTML>=6){
                                seconds0.innerHTML%=6
                                minutes1.innerHTML++;
                                if(minutes1.innerHTML>=10){
                                    minutes1.innerHTML%=10;
                                    minutes0.innerHTML++;
                                    if(minutes0.innerHTML>=6){
                                        minute0.innerHTML%=6;
                                        hours1.innerHTML++;
                                        if(hours1.innerHTML>=10){
                                            hours1.innerHTML%=10;
                                            hours0.innerHTML++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            function stop1(){//  暫停/中止
                clearInterval(flag);
            }

        </script>
    </body>
</html>

###代碼B

<!Doctype html>
<html>
    <head>
        <title>仍然有延遲的秒錶</title>
        <style type="text/css"></style>        
    </head>
    <body>
        <div id="div1">
            <span id="span1">00</span> :
            <span id="span2">00</span> :
            <span id="span3">00</span> :
            <span id="span4">00</span>
        </div>
        <input id="input1" type="button" value="start" onclick="whenClick();">
        <input id="input2" type="button" value="clear" onclick="clear1();">
        <script  type="text/javascript">
            var milliSeconds1 = document.getElementById("span4");
            var seconds1 = document.getElementById("span3");
            var minutes1 = document.getElementById("span2");
            var hours1 = document.getElementById("span1");
            var time = 0;
            var flag;

            function whenClick(){//  開始/暫停
                var inputValue = document.getElementById("input1");
                if(inputValue.value=="start"||inputValue.value=="continue"){
                    inputValue.value=" stop";
                    start1();
                }
                else {
                    inputValue.value="continue";
                    stop1();//前端全棧交流學習圈:866109386
                }//面相1-3年經驗前端開發人員
            }//幫助突破技術瓶頸,提高思惟能力
            
            function clear1(){//  清零
                stop1();
                milliSeconds1.innerHTML = seconds1.innerHTML =minutes1.innerHTML = hours1.innerHTML = "00";
                time=0;
                document.getElementById("input1").value = "start";
            }

            function start1(){//  開始/繼續
                flag = setInterval("timeIncrement();",10);
            }

            function timeIncrement(){
                time++;
                var a=time%100;
                var b=time%6000/100;
                var c=time%360000/6000;
                var d=time%8640000/360000;
                milliSeconds1.innerHTML=(a<10)?('0'+a):a;
                seconds1.innerHTML=(b<10)?('0'+Math.floor(b)):(Math.floor(b));
                minutes1.innerHTML=(c<10)?('0'+Math.floor(c)):(Math.floor(c));
                hours1.innerHTML=(d<10)?('0'+Math.floor(d)):(Math.floor(d));
            }

            function stop1(){//  暫停/中止
                clearInterval(flag);
            }

        </script>
    </body>
</html>

###C代碼

<!Doctype html>
<html>
    <head>
        <title>秒錶</title>
        <style type="text/css"></style>        
    </head>
    <body>
        <div id="div1">
            <span id="span1">00</span> :
            <span id="span2">00</span> :
            <span id="span3">00</span> :
            <span id="span4">00</span>
        </div>
        <input id="input1" type="button" value="start" onclick="whenClick();">
        <input id="input2" type="button" value="clear" onclick="clear1();">
        <script  type="text/javascript">
            var milliSeconds1 = document.getElementById("span4");
            var seconds1 = document.getElementById("span3");
            var minutes1 = document.getElementById("span2");
            var hours1 = document.getElementById("span1");
            var time=0;
            var pre_time=0; //前端全棧交流學習圈:866109386
            var intervals=0;//面相1-3年經驗前端開發人員
            var pre_intervals=0;//幫助突破技術瓶頸,提高思惟能力
            var flag;

            function whenClick(){//  開始/暫停
                var inputValue = document.getElementById("input1");
                if(inputValue.value=="start"||inputValue.value=="continue"){
                    var date= new Date();
                    time = date.getTime();
                    pre_time=time;
                    inputValue.value="stop ";
                    start1();
                }
                else {
                    inputValue.value="continue";
                    stop1();
                }
            }
            
            function clear1(){//  清零
                stop1();
                milliSeconds1.innerHTML = seconds1.innerHTML =minutes1.innerHTML = hours1.innerHTML = "00";
                time=0;
                pre_time=0;
                intervals=0;
                pre_intervals=0;
                document.getElementById("input1").value = "start";
            }

            function start1(){//  開始/繼續
                flag = setInterval("timeIncrement();",10);
            }
            
            function timeIncrement(){
                date = new Date();
                intervals=date.getTime()-time+pre_intervals;
                var a=intervals%1000/10;
                var b=intervals%60000/1000;
                var c=intervals%3600000/60000;
                var d=intervals/3600000;
                milliSeconds1.innerHTML=(a<10)?('0'+Math.floor(a)):(Math.floor(a));
                seconds1.innerHTML=(b<10)?('0'+Math.floor(b)):(Math.floor(b));
                minutes1.innerHTML=(c<10)?('0'+Math.floor(c)):(Math.floor(c));
                hours1.innerHTML=(d<10)?('0'+Math.floor(d)):(Math.floor(d));
            }

            function stop1(){//  暫停/中止
                date = new Date();
                pre_intervals += date.getTime()-pre_time;
                clearInterval(flag);
            }

        </script>
    </body>
</html>

以上就是我本次想要分享的一些東西,若是有更好的方法歡迎你們留言討論。

相關文章
相關標籤/搜索