zoukankan      html  css  js  c++  java
  • javascript计时器的实现

      用Javascript实现计时器主要用到的函数是setTimeout()和clearTimeout()。把超时时间设置为1000ms,也就是每秒进行一次更新,停止计时时用clearTimeout()进行取消。

      先在.html文件中写上基本框架:

    <html>
    <head>
    <script type="text/javascript" src="script.js"></script>
    </head>
    <body>
    <h3 id="time">00:00</h3>
    <div>
    <a href="#" id="start">开始</a>&nbsp;&nbsp;<a href="#" id="stop">停止</a>
    </div>
    </body>
    </html>

    用一个全局变量c进行计数,每一秒钟执行一次c++;所以基本的想法就是用一个函数每隔1s递归一次并让c加1:

    function timedCount(){    
    c
    =c+1;
    t
    =setTimeout("timedCount()",1000);
    }

    这样的话很容易写出script.js文件:

    window.onload = initAll;
    var text;
    var c=0;
    function initAll(){
    text
    = document.getElementById("time");
    document.getElementById(
    "start").onclick = timedCount;
    document.getElementById(
    "stop").onclick = stopCount;;
    }
    function timedCount(){
    text.innerHTML
    =c;
    c
    =c+1;
    t
    =setTimeout("timedCount()",1000);
    return false;
    }
    function stopCount(){
    clearTimeout(t);
    c
    =0;
    return false;
    }

    但是这样的话显示的计时只是数秒,为了显示分钟,将代码改为:

    //...
    function timedCount(){
    var m = getminute(c);
    var s = getsecond(c,m);
    text.innerHTML
    =m+":"+s;
    c
    =c+1;
    t
    =setTimeout("timedCount()",1000);
    return false;
    }
    function stopCount(){
    clearTimeout(t);
    c
    =0;
    return false;
    }

    function getminute(c){//得到分钟数
    var m = parseInt(c/60);
    m = checkTime(m);
    return m;
    }
    function getsecond(c,m){//得到秒数
    var s = c - m*60;
    s
    =checkTime(s);
    return s;
    }
    function checkTime(i){//如果结果为个位数,则在前面补零
    if (i<10)
    {
    i
    ="0" + i
    }
    return i
    }

    另外有一个问题,如果用户点过“开始”后,如果没有点“停止”而又点了一次“开始”,此时计数并不清零,而且计数速度也更快了,不再是每秒增加1。为了避免这一点,可以加一个标记判断是否已经点过“停止”,也可以用try{}catch(){}语句。此外还可以设置页面载入后只显示“开始”,而点过“开始”后则隐藏“开始”只显示“停止”。这样完整代码为:

    window.onload = initAll;
    var text;
    var c=0;
    function initAll(){
    text
    = document.getElementById("time");
    document.getElementById(
    "stop").innerHTML = ""  //隐藏“停止”
    document.getElementById(
    "start").onclick = timedCount;
    document.getElementById(
    "stop").onclick = stopCount;;
    }
    function timedCount(){
    document.getElementById(
    "start").innerHTML = "";
    document.getElementById(
    "stop").innerHTML = "停止"  //隐藏“开始”
    var m = getminute(c);
    var s = getsecond(c,m);
    text.innerHTML
    =m+":"+s;
    c
    =c+1;
    t
    =setTimeout("timedCount()",1000);
    return false;
    }
    function stopCount(){
    document.getElementById(
    "start").innerHTML = "开始";
    document.getElementById(
    "stop").innerHTML = "";  //隐藏“停止”  
       clearTimeout(t);
    c
    =0;
    return false;
    }

    function getminute(c){
    var m = parseInt(c/60);
    m = checkTime(m);
    return m;
    }
    function getsecond(c,m){
    var s = c - m*60;
    s
    =checkTime(s);
    return s;
    }
    function checkTime(i){
    if (i<10)
    {
    i
    ="0" + i
    }
    return i
    }

    查看实现的效果

  • 相关阅读:
    SpringBoot Jpa 双数据源mysql + oracle + liquibase+参考源码
    C#:将字符串中连续空格作为分隔符获取多段模糊查询的字符串
    C# 传入参数2021-05-18T00:00:00.000Z使用ToDateTime日期在此基础上加8小时
    修改DbContext并不是线程安全的bug处理。
    产品经理推荐书籍
    抽象类、类和接口
    git 分支合并主干出现冲突的解决办法
    HttpClient请求设置Content-Type标头空格问题
    C# 3Des加密解密
    WPF 颜色选择器
  • 原文地址:https://www.cnblogs.com/sunshy/p/2155497.html
Copyright © 2011-2022 走看看