我技术不硬,最近遇到了一个问题,就是动态的让获取到的时间动态的变化,以防万一又犯同样的错误,因此记下来好查找。也希望对大家有帮助。

 

注意:这是我个人的理解,如果有错请见谅,您可以在评论中指出,谢谢。

 

首先我们来了解一下setTimeout和setInterval这两个方法。

 

 

setTimeout

 

setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。(在指定的延迟时间之后调用一个函数或者执行一个代码片段。)

 

举个例子:

setTimeout("alert('hello')",5000)

在你打开页面之后,过了5秒就会出现弹框,之后就不会再弹了。

 

setTimeout的使用方法:

setTimeout(code,millisec)
//code 要调用的函数后要执行的javascript代码串
//millisec 在执行代码需等待的毫秒数


下面这些是我所收集的和测试的,可以运行,我简单的理解为:

//写法1:可以直接执行代码

setTimeout("要执行的代码",等待的毫秒数) //1000为1s

//写法2、可以执行函数

setTimeout("函数对象",等待的毫秒数)



//3

setTimeout(function(){},等待的毫秒数)

//4

setTimeout(函数名,等待的毫秒数)

//5


setTimeout(alert('123'),等待的毫秒数)

 

例子:

//打开页面5秒后弹出弹框。


//写法一

setTimeout("alert('hello')",5000)


//写法二

setTimeout("date()",5000)

function date(){

        alert('hello');
   }

 

 

 想要停止setTimeout,可以使用clearTimeout()方法,它可以取消由 setTimeout() 方法设置的 timeout。一般都是通过事件或条件来配合使用,不明白咋们就举个例子

html:

<form>
    <input type="text" id="inp1">
    <input type="button"onc; onclick="clearTimeout(tt)" value="暂停">
</form>

//只要单击暂停,timeout就会被取消,数字就不会再继续增加了。

js:

<script>

        var i = 0;  //默认数值
        
        function sum(){

            i = i + 1;  
            document.getElementById('inp1').value = i;
            tt = setTimeout("sum()",1000)   //tt为setTimeout.
           }
            sum()
</script>

 

 

我们需要做的动态时间,一般都是使用setTimeout来实现的,但setTimeout只会调用一次,那怎么实现动态时间呢?

 

方法:

<p></p>
function start(){
    
    var date = new Date()
    var h = date.getHours()    //时
    var m = date.getMinutes()   //分
    var s = date.getSeconds()    //秒

     document.querySelector('p').innerHTML = h+':'+m+':'+s

       t = setTimeout("start()",1000)

}
start()  //调用

这样,只要代码一执行,就可以每过一秒更新一次了。

 

但如果用setTimeout来做计数器的话,会出现一个问题,就是连续点击开始计数会出现数字跳动频率变快了,其实并不是变快了,而是生成了多个计时器,每点一次就加多一个。那该怎么解决?

 

解决方法:

<input type="text"name="" value="">
    <button onclick="start()">开始</button>
var input = document.querySelector('input')
    var i = 1   
    var t
   
    function start(){
        
            clearTimeout(t) //不管有没有timeout,都先clear掉。
           input.value = i;
            i++
            t = setTimeout("start()",1000)
        
    }

 

这样就不会生成多个了。但还会遇到新的问题,就是每次点击后都会立马加一的这种情况,所以,

 

解决方法:

var input = document.querySelector('input')
    var i = 1
    var t;
   
    function start(can){
          can = can || false
           if(!can){          //取反
            clearTimeout(t)          
          }else{

            input.value = i;
            ++i
          }
            t = setTimeout(function(){
                start(true)},1000)
        
    }

但还是存在问题,连续单击会发现数字不会增加,除了禁用按钮外,我暂时找不到解决办法,现在仍在找,如果大家知道怎么做,请务必告诉我,先谢谢大家了。

 

 

 

setInterval

 

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。(会一直执行到被clearInterval或者窗口被关掉)

 

举个例子

setInterval('alert("Hello");', 1000);

当你打开页面后过一秒就会出现弹窗,再过一秒继续弹。

 

setInterval的用法

用法也和setTimeout差不多,就不举例子了(人懒 ^_^)

setInterval(code, milliseconds);
//code 要调用的函数后要执行的javascript代码串
//millisec 在执行代码需等待的毫秒数


setInterval(function, milliseconds, param1, param2, ...)
//param1, param2, ... 不是必须的, 传给执行函数的其他参数(IE9 及其更早版本不支持该参数)。

 

setInterval做动态时间很简单,就直接setInterval(fun(),1000)就ok了。就用我做我项目时打的代码做例子吧!

var time2 = setInterval(date2,1000)  //就直接一句话就ok了。
			function date2(){
    
            //本人能力有限,获取本地时间

            var date1 = new Date()
            var hour = date1.getHours()

            //获取分

            var min = date1.getMinutes()

            //秒,用来测试时候在运行,所以不重要
            var s = date1.getSeconds()
            //个位数时在十位补零。
            var hour1 = date1.getHours().toString().padStart(2, "0");
            var minute = date1.getMinutes().toString().padStart(2, "0");
            document.getElementById("realtime").innerHTML = hour1+':'+minute
          }

 

计时器的实现直接在函数里累加就行了,可以去这网站看看点这

 

                                                          连续单击会发现数字不会增加,除了禁用按钮外,我暂时找不到解决办法,现在仍在找,如果大家知道怎么做,请务必告诉我,先谢谢大家了。

 

注意:不太建议使用setInterval,因为它不会去管你的代码对错,也不会管是否有网络延迟,会不断的执行,很容易造成卡死。