0.前言
有一段時間沒有寫博客了,不過令我高興地是寫了這么長時間的文章,終于收到了關注和評價,在首頁上通過了文章,非常高興,也很興奮!!好了言歸正傳,我來分享一下今天主要的知識點:間歇性定時器和延時定時器。學完這個,我們可以寫一些時鐘、秒表、進度條等有趣控件。
1.間歇性定時器——setInterval
格式:setInterval(參數1,參數2);
參數:參數1表示函數名,參數2表示設置的時間(毫秒);
功能:每間隔參數2時間,調用一次參數1函數;
返回值:定時器的id,可單位是毫秒以通過這個id關閉定時器
(1)創建定時器
var timer = setInterval(func,1000);
用一個變量保存定時器,注意,用setInterval創建定時器即啟動,同時返回該定時的id。
(2)關閉定時器
既然創建了定時器,那么如何關閉定時器呢?
通過返回得到定時器的id,從而關閉定時器。用clearInterval方法。
clearInterval(timer);
其中的“timer”表示的是上面常見定時器器是所用的變量。
注意:JS中沒有暫停一說,關閉就銷毀了。如果需要繼續運行,則需重新創建定時器。
2.延時定時器——setTimeout
格式:setTimeout(參數1,參數2);
參數:參數1表示的是函數名,參數2表示設置的時間(毫秒);
功能:參數2時間后調用參數1函數;
返回值:返回定時器的id,可以通過該id關閉定時器
(1)創建定時器
var timer = setTimeout(func,1000);
(2)關閉定時器
clearTimeout(timer);
3.兩者比較
用setInterval創建定時器是載入界面后,每間隔參數2個時間,執行一次參數1函數,是連續執行的;而setTimeout創建的定時器是先執行參數2,然后再執行參數1,記住只執行一次參數1,不是連續的。
4.案例
說了這么多,可能感覺到非常暈,下面我來用例子說明上面的問題。
(1)setInterval
首先我們打個界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>定時器-間歇性定時器</title>
</head>
<body>
<button onclick="consoleInterval()">關閉定時器(暫停)</button>
<button onclick="goOn()">繼續</button>
</body>
</html>
運行結果如下:
然后編寫函數,在body標簽里面添加如下代碼:
<script type="text/javascript">
var timer = window.setInterval(func,1000);
function func() {
console.log("hello world!!!");
}
function consoleInterval() {
window.clearInterval(timer);
}
function goOn() {
timer = window.setInterval(func,1000);
}
</script>
此時在控制臺上的結果為:
出現的bug
??當我們連續點擊“繼續”按鈕發現打印的速度變得非常快,而且再點擊關閉定時器會發下,管不了,這是為什么呢?
因為,當我們連續點擊繼續按鈕時,相當于創建了多個定時器,再點關閉按鈕,他只能關閉當前最后一次點擊時出現的定時器,前面創建的的定時器是關閉不了的,所以會出現上述情況。
解決辦法:用一個變量來判斷定時器是存在的還會被注銷了。
修改js代碼如下:
<script type="text/javascript">
var timer = window.setInterval(func,1000);
var flag = true;
function func() {
console.log("hello world!!!");
}
function consoleInterval() {
window.clearInterval(timer);
flag = false;
}
function goOn() {
if(flag){
return;
}
timer = window.setInterval(func,1000);
flag = true;
}
</script>
詳解:
??在一開始創建定時器時,將flag設置為true,表示當前存在定時器。當點擊“關閉”按鈕時,相當于銷毀了定時器,此時將flag設置為false,表示沒有定時器的存在;當調用“繼續”按鈕時,首先要判斷flag,如果flag為true,表示當前有定時器,不需要創建了,不會再執行后面的代碼,若果flag為false,表示沒有定時器,就可以創建定時器,從而有效的避免上述出現的問題。
5.總結
終于說完了,累死我了,關于這兩個定時器,我知道的也就這么多了,謝謝打賞!!!