JS之簡單計時器的製作(精確到10ms)

来源:https://www.cnblogs.com/frozen-sky/archive/2018/08/06/9434179.html
-Advertisement-
Play Games

<!--利用js製作簡單的計時器(給出了思路、分析以及源代碼)--> 這段時間剛接觸js,想利用所學的知識自製一款簡單的計時器。 製作計時器的思路如下: 1、首先定出功能以及界面。 我的目的是做最簡單的計時器,因此只需要開始、結束以及清零的功能。界面如下圖所示: 未開始運行: 運行中: 2、構思實現 ...


<!--利用js製作簡單的秒錶(給出了思路、分析以及源代碼)-->

 

這段時間剛接觸js,想利用所學的知識自製一款簡單的秒錶。

製作秒錶的思路如下:

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

我的目的是做最簡單的秒錶,因此只需要開始、結束以及清零的功能。界面如下圖所示:

未開始運行:

運行中:  

2、構思實現的方式。

首先,核心方法肯定是 setInterval() 方法,用於周期性地顯示時間。 因為我要精確到10ms, 所以設置時間間隔為10。

再者,如何令時間遞增?

 

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

但是,為了保證格式的統一性(我想要顯示 02:01:24:06,而不是顯示 2:1:24:6),於是又將四個變數變為8個變數,思想同上。(代碼參見本頁最後 “有延時的秒錶”)。

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

 

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

 1 <!doctype html>
 2 <html>
 3     <head>
 4         <title>有延遲的秒錶</title>
 5         <style type="text/css"></style>        
 6     </head>
 7     <body>
 8         <div id="div1">
 9             <span id="span10">0</span><span id="span11">0</span> :
10             <span id="span20">0</span><span id="span21">0</span> :
11             <span id="span30">0</span><span id="span31">0</span> :
12             <span id="span40">0</span><span id="span41">0</span>
13         </div>
14         <input id="input1" type="button" value="start" onclick="whenClick();">
15         <input id="input2" type="button" value="clear" onclick="clear1();">
16         <script  type="text/javascript">
17             var milliSeconds1 = document.getElementById("span41");
18             var milliSeconds0 = document.getElementById("span40");
19             var seconds1 = document.getElementById("span31");
20             var seconds0 = document.getElementById("span30");
21             var minutes1 = document.getElementById("span21");
22             var minutes0 = document.getElementById("span20");
23             var hours1 = document.getElementById("span11");
24             var hours0 = document.getElementById("span10");
25             var flag;
26 
27             function whenClick(){//  開始/暫停
28                 var inputValue = document.getElementById("input1");
29                 if(inputValue.value=="start"||inputValue.value=="continue"){
30                     inputValue.value=" stop";
31                     start1();
32                 }
33                 else {
34                     inputValue.value="continue";
35                     stop1();
36                 }
37             }
38             
39             function clear1(){//  清零
40                 stop1();
41                 milliSeconds1.innerHTML = milliSeconds0.innerHTML = 
42                 seconds1.innerHTML = seconds0.innerHTML = minutes1.innerHTML = 
43                 minutes0.innerHTML = hours1.innerHTML = hours0.innerHTML = 0;
44                 document.getElementById("input1").value = "start";
45             }
46 
47             function start1(){//  開始/繼續
48                 flag = setInterval("timeIncrement();",10);
49             }
50 
51             function timeIncrement(){
52                 milliSeconds1.innerHTML++;
53                 if(milliSeconds1.innerHTML>=10){
54                     milliSeconds1.innerHTML%=10;
55                     milliSeconds0.innerHTML++;
56                     if(milliSeconds0.innerHTML>=10){
57                         milliSeconds0.innerHTML%=10;
58                         seconds1.innerHTML++;
59                         if(seconds1.innerHTML>=10){
60                             seconds1.innerHTML%=10;
61                             seconds0.innerHTML++;
62                             if(seconds0.innerHTML>=6){
63                                 seconds0.innerHTML%=6
64                                 minutes1.innerHTML++;
65                                 if(minutes1.innerHTML>=10){
66                                     minutes1.innerHTML%=10;
67                                     minutes0.innerHTML++;
68                                     if(minutes0.innerHTML>=6){
69                                         minute0.innerHTML%=6;
70                                         hours1.innerHTML++;
71                                         if(hours1.innerHTML>=10){
72                                             hours1.innerHTML%=10;
73                                             hours0.innerHTML++;
74                                         }
75                                     }
76                                 }
77                             }
78                         }
79                     }
80                 }
81             }
82 
83             function stop1(){//  暫停/停止
84                 clearInterval(flag);
85             }
86 
87         </script>
88     </body>
89 </html>

代碼B

 1 <!doctype html>
 2 <html>
 3     <head>
 4         <title>仍然有延遲的秒錶</title>
 5         <style type="text/css"></style>        
 6     </head>
 7     <body>
 8         <div id="div1">
 9             <span id="span1">00</span> :
10             <span id="span2">00</span> :
11             <span id="span3">00</span> :
12             <span id="span4">00</span>
13         </div>
14         <input id="input1" type="button" value="start" onclick="whenClick();">
15         <input id="input2" type="button" value="clear" onclick="clear1();">
16         <script  type="text/javascript">
17             var milliSeconds1 = document.getElementById("span4");
18             var seconds1 = document.getElementById("span3");
19             var minutes1 = document.getElementById("span2");
20             var hours1 = document.getElementById("span1");
21             var time = 0;
22             var flag;
23 
24             function whenClick(){//  開始/暫停
25                 var inputValue = document.getElementById("input1");
26                 if(inputValue.value=="start"||inputValue.value=="continue"){
27                     inputValue.value=" stop";
28                     start1();
29                 }
30                 else {
31                     inputValue.value="continue";
32                     stop1();
33                 }
34             }
35             
36             function clear1(){//  清零
37                 stop1();
38                 milliSeconds1.innerHTML = seconds1.innerHTML =minutes1.innerHTML = hours1.innerHTML = "00";
39                 time=0;
40                 document.getElementById("input1").value = "start";
41             }
42 
43             function start1(){//  開始/繼續
44                 flag = setInterval("timeIncrement();",10);
45             }
46 
47             function timeIncrement(){
48                 time++;
49                 var a=time%100;
50                 var b=time%6000/100;
51                 var c=time%360000/6000;
52                 var d=time%8640000/360000;
53                 milliSeconds1.innerHTML=(a<10)?('0'+a):a;
54                 seconds1.innerHTML=(b<10)?('0'+Math.floor(b)):(Math.floor(b));
55                 minutes1.innerHTML=(c<10)?('0'+Math.floor(c)):(Math.floor(c));
56                 hours1.innerHTML=(d<10)?('0'+Math.floor(d)):(Math.floor(d));
57             }
58 
59             function stop1(){//  暫停/停止
60                 clearInterval(flag);
61             }
62 
63         </script>
64     </body>
65 </html>

代碼C(與時間同步的代碼)

 1 <!doctype html>
 2 <html>
 3     <head>
 4         <title>秒錶</title>
 5         <style type="text/css"></style>        
 6     </head>
 7     <body>
 8         <div id="div1">
 9             <span id="span1">00</span> :
10             <span id="span2">00</span> :
11             <span id="span3">00</span> :
12             <span id="span4">00</span>
13         </div>
14         <input id="input1" type="button" value="start" onclick="whenClick();">
15         <input id="input2" type="button" value="clear" onclick="clear1();">
16         <script  type="text/javascript">
17             var milliSeconds1 = document.getElementById("span4");
18             var seconds1 = document.getElementById("span3");
19             var minutes1 = document.getElementById("span2");
20             var hours1 = document.getElementById("span1");
21             var time=0;
22             var pre_time=0;
23             var intervals=0;
24             var pre_intervals=0;
25             var flag;
26 
27             function whenClick(){//  開始/暫停
28                 var inputValue = document.getElementById("
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環信EaseUI 集成,集成不做描述,看文檔即可,下麵主要談一些對easeui的個性化需求修改。 一、如何將App用戶體系的用戶名和用戶頭像 顯示於環信的easeui 這個問題是所有人都想解決的,集成easeui之後 ,雖然大部分功能給我們做好了,但是他是顯示的環信用戶體系的用戶名和預設的頭像。 這 ...
  • 一.前言 我們一定心裡有個疑問,我們那個多態是怎麼回事?我們指定的一個介面,卻可以等到運行時可以對應於不同的實現類。這是因為,Java有個特性就是依賴運行期動態載入和動態連接,這樣實現了Java可以動態進行擴展。我們甚至可以從網路或者其他的地方載入一個二進位流作為程式的一部分。所以,我們通過編譯器將 ...
  • 將項目改成Module 打包混淆腳本 混淆配置proguard-rules.pro文件 開始打包 ...
  • 在做android圖片載入的時候,由於手機屏幕受限,很多大圖載入過來的時候,我們要求等比例縮放,比如按照固定的寬度,等比例縮放高度,使得圖片的尺寸比例得到相應的縮放,但圖片沒有變形。顯然按照android:scaleType不能實現,因為會有很多限制,所以必須要自己寫演算法。 通過Glide來縮放 其 ...
  • Glide是一個快速高效的多媒體管理和圖像載入的框架,封裝了Android平臺的多媒體的解碼,記憶體和硬碟緩存等,Glide支持解碼、顯示視頻、圖像和GIFs,Glide是基於定製的HttpUrlConnection,下麵是關於Glide的配置和使用。 Glide的配置 配置很簡單,只要在Module ...
  • Android常用許可權 ...
  • 一.概述 我們在進行 Java 開發的時候,很少關心 Java 的記憶體分配等等,因為這些活都讓 JVM 給我們做了。不僅自動給我們分配記憶體,還有自動的回收無需再占用的記憶體空間,以騰出記憶體供其他人使用。但是我們經常面臨的一個問題就是記憶體泄漏,JVM無法完成回收工作,導致記憶體占用暴漲,最後可能讓程式奔潰 ...
  • 目錄 HTTP簡介 HTTP工作原理 HTTP消息結構 客戶端請求消息 伺服器響應消息 實例 HTTP請求方法 HTTP響應頭信息 HTTP狀態碼 HTTP狀態碼分類 HTTP狀態碼列表 HTTP content-type對照表 HTTP簡介 HTTP協議是Hyper Text Transfer P ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...