简体   繁体   English

javascript中的普通计数计时器

[英]plain count up timer in javascript

I am looking for a simple count up timer in javascript.我在 javascript 中寻找一个简单的计数计时器。 All the scripts I find are 'all singing all dancing'.我找到的所有剧本都是“唱歌跳舞”。 I just want a jQuery free, minimal fuss count up timer that displays in minutes and seconds.我只想要一个免费的、最小的、以分钟和秒显示的计时器。 Thanks.谢谢。

Check this:检查这个:

 var minutesLabel = document.getElementById("minutes"); var secondsLabel = document.getElementById("seconds"); var totalSeconds = 0; setInterval(setTime, 1000); function setTime() { ++totalSeconds; secondsLabel.innerHTML = pad(totalSeconds % 60); minutesLabel.innerHTML = pad(parseInt(totalSeconds / 60)); } function pad(val) { var valString = val + ""; if (valString.length < 2) { return "0" + valString; } else { return valString; } }
 <label id="minutes">00</label>:<label id="seconds">00</label>

Timer for jQuery - smaller, working, tested. jQuery 计时器 - 更小,有效,经过测试。

 var sec = 0; function pad ( val ) { return val > 9 ? val : "0" + val; } setInterval( function(){ $("#seconds").html(pad(++sec%60)); $("#minutes").html(pad(parseInt(sec/60,10))); }, 1000);
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <span id="minutes"></span>:<span id="seconds"></span>

Pure JavaScript:纯 JavaScript:

 var sec = 0; function pad ( val ) { return val > 9 ? val : "0" + val; } setInterval( function(){ document.getElementById("seconds").innerHTML=pad(++sec%60); document.getElementById("minutes").innerHTML=pad(parseInt(sec/60,10)); }, 1000);
 <span id="minutes"></span>:<span id="seconds"></span>

Update:更新:

This answer shows how to pad.这个答案显示了如何填充。

Stopping setInterval MDN is achieved with clearInterval MDN停止 setInterval MDN是通过 clearInterval MDN实现的

var timer = setInterval ( function(){...}, 1000 );
...
clearInterval ( timer );

Fiddle小提琴

The following code works as a count-up timer.以下代码用作计数计时器。 It's pure JavaScript code which shows hour:minute:second .它是纯 JavaScript 代码,显示hour:minute:second It also has a STOP button:它还有一个停止按钮:

 var timerVar = setInterval(countTimer, 1000); var totalSeconds = 0; function countTimer() { ++totalSeconds; var hour = Math.floor(totalSeconds /3600); var minute = Math.floor((totalSeconds - hour*3600)/60); var seconds = totalSeconds - (hour*3600 + minute*60); if(hour < 10) hour = "0"+hour; if(minute < 10) minute = "0"+minute; if(seconds < 10) seconds = "0"+seconds; document.getElementById("timer").innerHTML = hour + ":" + minute + ":" + seconds; }
 <div id="timer"></div> <div id ="stop_timer" onclick="clearInterval(timerVar)">Stop time</div>

I had to create a timer for teachers grading students' work.我必须为老师对学生作业的评分创建一个计时器。 Here's one I used which is entirely based on elapsed time since the grading begun by storing the system time at the point that the page is loaded, and then comparing it every half second to the system time at that point:这是我使用的一个完全基于自评分开始以来经过的时间,通过存储页面加载时的系统时间,然后每半秒将其与该点的系统时间进行比较:

var startTime = Math.floor(Date.now() / 1000); //Get the starting time (right now) in seconds
localStorage.setItem("startTime", startTime); // Store it if I want to restart the timer on the next page

function startTimeCounter() {
    var now = Math.floor(Date.now() / 1000); // get the time now
    var diff = now - startTime; // diff in seconds between now and start
    var m = Math.floor(diff / 60); // get minutes value (quotient of diff)
    var s = Math.floor(diff % 60); // get seconds value (remainder of diff)
    m = checkTime(m); // add a leading zero if it's single digit
    s = checkTime(s); // add a leading zero if it's single digit
    document.getElementById("idName").innerHTML = m + ":" + s; // update the element where the timer will appear
    var t = setTimeout(startTimeCounter, 500); // set a timeout to update the timer
}

function checkTime(i) {
    if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
    return i;
}

startTimeCounter();

This way, it really doesn't matter if the 'setTimeout' is subject to execution delays, the elapsed time is always relative the system time when it first began, and the system time at the time of update.这样,“setTimeout”是否会受到执行延迟的影响并不重要,经过的时间总是相对于它第一次开始时的系统时间和更新时的系统时间。

Fiddled around with the Bakudan's code and other code in stackoverflow to get everything in one.在 stackoverflow 中摆弄 Bakudan 的代码和其他代码,将所有内容合二为一。

Update #1 : Added more options.更新 #1:添加了更多选项。 Now Start, pause, resume, reset and restart.现在开始、暂停、恢复、重置和重新启动。 Mix the functions to get desired results.混合函数以获得所需的结果。

Update #2 : Edited out previously used JQuery codes for pure JS and added as code snippet.更新 #2:编辑出以前使用的纯 JS 的 JQuery 代码并添加为代码片段。

For previous Jquery based fiddle version : https://jsfiddle.net/wizajay/rro5pna3/305/对于以前基于 Jquery 的小提琴版本: https : //jsfiddle.net/wizajay/rro5pna3/305/

 var Clock = { totalSeconds: 0, start: function () { if (!this.interval) { var self = this; function pad(val) { return val > 9 ? val : "0" + val; } this.interval = setInterval(function () { self.totalSeconds += 1; document.getElementById("min").innerHTML = pad(Math.floor(self.totalSeconds / 60 % 60)); document.getElementById("sec").innerHTML = pad(parseInt(self.totalSeconds % 60)); }, 1000); } }, reset: function () { Clock.totalSeconds = null; clearInterval(this.interval); document.getElementById("min").innerHTML = "00"; document.getElementById("sec").innerHTML = "00"; delete this.interval; }, pause: function () { clearInterval(this.interval); delete this.interval; }, resume: function () { this.start(); }, restart: function () { this.reset(); Clock.start(); } }; document.getElementById("startButton").addEventListener("click", function () { Clock.start(); }); document.getElementById("pauseButton").addEventListener("click", function () { Clock.pause(); }); document.getElementById("resumeButton").addEventListener("click", function () { Clock.resume(); }); document.getElementById("resetButton").addEventListener("click", function () { Clock.reset(); }); document.getElementById("restartButton").addEventListener("click", function () { Clock.restart(); });
 <span id="min">00</span>:<span id="sec">00</span> <input id="startButton" type="button" value="Start"> <input id="pauseButton" type="button" value="Pause"> <input id="resumeButton" type="button" value="Resume"> <input id="resetButton" type="button" value="Reset"> <input id="restartButton" type="button" value="Restart">

Extending from @Chandu, with some UI added:从@Chandu 扩展,添加了一些 UI:

<html>
<head>
<script   src="https://code.jquery.com/jquery-3.2.1.min.js"   integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="   crossorigin="anonymous"></script>
</head>
<style>
button {
background: steelblue; 
border-radius: 4px; 
height: 40px; 
width: 100px; 
color: white; 
font-size: 20px; 
cursor: pointer; 
border: none; 
}
button:focus {
outline: 0; 
}
#minutes, #seconds {
font-size: 40px; 
}
.bigger {
font-size: 40px; 
}
.button {
  box-shadow: 0 9px #999;
}

.button:hover {background-color: hotpink}

.button:active {
  background-color: hotpink;
  box-shadow: 0 5px #666;
  transform: translateY(4px);
}
</style>
<body align='center'>
<button onclick='set_timer()' class='button'>START</button>
<button onclick='stop_timer()' class='button'>STOP</button><br><br>
<label id="minutes">00</label><span class='bigger'>:</span><label id="seconds">00</label>
</body>
</html>
<script>

function pad(val) {
  valString = val + "";
  if(valString.length < 2) {
     return "0" + valString;
     } else {
     return valString;
     }
}

totalSeconds = 0;
function setTime(minutesLabel, secondsLabel) {
    totalSeconds++;
    secondsLabel.innerHTML = pad(totalSeconds%60);
    minutesLabel.innerHTML = pad(parseInt(totalSeconds/60));
    }

function set_timer() {
    minutesLabel = document.getElementById("minutes");
    secondsLabel = document.getElementById("seconds");
    my_int = setInterval(function() { setTime(minutesLabel, secondsLabel)}, 1000);
}

function stop_timer() {
  clearInterval(my_int);
}


</script>

Looks as follows:看起来如下:

在此处输入图片说明

Note: Always include jQuery before writing jQuery scripts注意:在编写 jQuery 脚本之前总是包含 jQuery

Step1: setInterval function is called every 1000ms (1s) Step1:每1000ms(1s)调用一次setInterval函数

Stpe2: In that function. Step2:在那个函数中。 Increment the seconds增加秒数

Step3: Check the Conditions步骤 3:检查条件

 <span id="count-up">0:00</span> <script> var min = 0; var second = 00; var zeroPlaceholder = 0; var counterId = setInterval(function(){ countUp(); }, 1000); function countUp () { second++; if(second == 59){ second = 00; min = min + 1; } if(second == 10){ zeroPlaceholder = ''; }else if(second == 00){ zeroPlaceholder = 0; } document.getElementById("count-up").innerText = min+':'+zeroPlaceholder+second; } </script>

 var minutesLabel = document.getElementById("minutes"); var secondsLabel = document.getElementById("seconds"); var totalSeconds = 0; setInterval(setTime, 1000); function setTime() { ++totalSeconds; secondsLabel.innerHTML = pad(totalSeconds % 60); minutesLabel.innerHTML = pad(parseInt(totalSeconds / 60)); } function pad(val) { var valString = val + ""; if (valString.length < 2) { return "0" + valString; } else { return valString; } } 
 <label id="minutes">00</label>:<label id="seconds">00</label> 

@Cybernate, I was looking for the same script today thanks for your input. @Cyber​​nate,我今天正在寻找相同的脚本,感谢您的输入。 However I changed it just a bit for jQuery...但是我为 jQuery 稍微改变了它......

function clock(){
    $('body').prepend('<div id="clock"><label id="minutes">00</label>:<label id="seconds">00</label></div>');
         var totalSeconds = 0;
        setInterval(setTime, 1000);
        function setTime()
        {
            ++totalSeconds;
            $('#clock > #seconds').html(pad(totalSeconds%60));
            $('#clock > #minutes').html(pad(parseInt(totalSeconds/60)));
        }
        function pad(val)
        {
            var valString = val + "";
            if(valString.length < 2)
            {
                return "0" + valString;
            }
            else
            {
                return valString;
            }
        }
}
$(document).ready(function(){
    clock();
    });

the css part: css部分:

<style>
#clock {
    padding: 10px;
    position:absolute;
    top: 0px;
    right: 0px;
    color: black;
}
</style>

Just wanted to put my 2 cents in. I modified @Ajay Singh's function to handle countdown and count up Here is a snip from the jsfiddle.只是想投入我的 2 美分。我修改了@Ajay Singh 的函数来处理倒计时和计数 这是来自 jsfiddle 的片段。

var countDown = Math.floor(Date.now() / 1000)
runClock(null, function(e, r){ console.log( e.seconds );}, countDown);
var t = setInterval(function(){
  runClock(function(){
    console.log('done');
    clearInterval(t);
  },function(timeElapsed, timeRemaining){
    console.log( timeElapsed.seconds );
  }, countDown);
}, 100);

https://jsfiddle.net/3g5xvaxe/ https://jsfiddle.net/3g5xvaxe/

Here is an React (Native) version:这是一个 React (Native) 版本:

import React, { Component } from 'react';
import {
    View,
    Text,
} from 'react-native';

export default class CountUp extends Component  {

    state = {
        seconds: null,
    }

    get formatedTime() {
        const { seconds } = this.state;

        return [
            pad(parseInt(seconds / 60)),
            pad(seconds % 60),
        ].join(':');
    }

    componentWillMount() {
        this.setState({ seconds: 0 });
    }

    componentDidMount() {
        this.timer = setInterval(
            () => this.setState({
                seconds: ++this.state.seconds
            }),
            1000
        );
    }

    componentWillUnmount() {
        clearInterval(this.timer);
    }

    render() {
        return (
            <View>
                <Text>{this.formatedTime}</Text>
            </View>
        );
    }
}

function pad(num) {
    return num.toString().length > 1 ? num : `0${num}`;
}

Here is one using .padStart() :这是使用.padStart()

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8' />
  <title>timer</title>
</head>
<body>
  <span id="minutes">00</span>:<span id="seconds">00</span>

  <script>
    const minutes = document.querySelector("#minutes")
    const seconds = document.querySelector("#seconds")
    let count = 0;

    const renderTimer = () => {
      count += 1;
      minutes.innerHTML = Math.floor(count / 60).toString().padStart(2, "0");
      seconds.innerHTML = (count % 60).toString().padStart(2, "0");
    }

    const timer = setInterval(renderTimer, 1000)
  </script>
</body>
</html>

From MDN : 来自 MDN

The padStart() method pads the current string with another string (repeated, if needed) so that the resulting string reaches the given length. padStart() 方法用另一个字符串(重复,如果需要)填充当前字符串,以便结果字符串达到给定长度。 The padding is applied from the start (left) of the current string.填充从当前字符串的开头(左侧)开始应用。

Check out these solutions:查看这些解决方案:

Compute elapsed time 计算经过时间

var countDownDate = new Date().getTime() + 60000;
var x = setInterval(function() {
    
          var time_to_count = 60000 // === 1 minute
          var now = new Date().getTime() + time_to_count;
    
          var distance = countDownDate - now;
    
          var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
          var seconds = Math.floor((distance % (1000 * 60)) / 1000);
    
          //Tag to display it
          document.getElementById("demo").innerHTML = minutes + "m " + seconds + "s ";
    
          // If the count down is finished, write some text
          if (distance < 0) {
            clearInterval(x);
            document.getElementById("demo").innerHTML = "EXPIRED";
          }
        }, 100)
      }

This is how I build timerView element which does not confuse by calling function many times.这就是我构建 timerView 元素的方式,它不会因多次调用函数而混淆。

 function startOTPCounter(countDownDate){ var countDownDate = '21/01/2022 16:56:26';//Change this date!! var x = setInterval(function() { var now = new Date().getTime(); var distance = moment(countDownDate, 'DD/MM/YYYY hh:mm:ss').toDate().getTime() - now; var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); document.getElementById("timerView").innerHTML = minutes + "min " + seconds + "sn"; if (distance < 0) { clearInterval(x); // document.location.reload(); document.getElementById("timerView").innerHTML = "Expired!"; } }, 1000); if(window.preInterval != undefined){ clearInterval(window.preInterval); } window.preInterval = x; //if(sessionStorage.preInterval != undefined){ // clearInterval(sessionStorage.preInterval); //} //sessionStorage.preInterval = x; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> <html> <head> </head> <body> <div> <p style="color:red; font-size: 15px; text-align:center; " id='timerView'></p> <input type="button" name="otpGonder" value="Send Again" class="buton btn btn-default " onclick="startOTPCounter()" id="otpGonder"> </div> </body> </html>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM