輕松解決JavaScript定時器越走越快的問題
解決JavaScript定時器越走越快的問題
之前在項目中寫了定時器來做循環(huán)播放,但是總是會有越走越快的問題,開始是以為前后的HTML代碼拼接的有問題,時間緊急的情況下反復(fù)改了很多也沒什么效果,后來發(fā)現(xiàn)是js定時器的問題,在這里記錄一下。
(setinterval)多次初始化
使用js定時器(setinterval)首要的問題就是要記得清除,即調(diào)用(clearInterval)方法,由于沒有使用定時器的經(jīng)驗(yàn),我一開始是沒有清除定時器,程序每一次初始化的時候都調(diào)用一次定時器,之前的定時器實(shí)例沒有被銷毀,新的定時器又開始執(zhí)行,就會出現(xiàn)1s變0.5s,0.5s變0.25秒的情況,從觀感上來看就是定時器“越走越快”了。
這個過程可以用幾行簡單的代碼模擬一下
<label id="lblShowNum"></label>
<input type="button" id="btnStart" value="啟動" />
<input type="button" id="btnClear" value="清除" />
window.onload = function () {
var i = 0;
var timer;
document.getElementById("btnStart").onclick = function () {
timer = setInterval(
function () {
i++;
document.getElementById("lblShowNum").innerText = i;
}, 1000);
}
document.getElementById("btnClear").onclick = function () {
clearInterval(timer);
}
}
如果只點(diǎn)擊一次“啟動”按鈕,定時器會正常運(yùn)行,點(diǎn)擊“清除”按鈕就可以暫停定時器,但是每一次點(diǎn)擊“啟動”按鈕,都會提高數(shù)字的增速,而清除功能也不再起作用,這就是因?yàn)樵诿恳淮吸c(diǎn)擊“啟動”的時候都有新的定時器被創(chuàng)建。
清除(clearInterval)的失效
但為什么清除的方法會失效呢?在代碼中我們定義了一個變量timer去接收定時器,對timer操作是不是就能清除定時器了呢?并不是是這樣,首先看下setinterval()返回值的說明
一個可以傳遞給 Window.clearInterval() 從而取消對 code 的周期性執(zhí)行的值。
這里可以看出這個返回值并不是定時器本身,它只是一個用于傳遞的返回值,如果想當(dāng)然的把它當(dāng)做定時器,以為每次初始化賦值就是新的定時器就錯了,我最開始就是這樣想的。
每一次給timer賦值都是在創(chuàng)建新的定時器對象,而且之前的定時器也并沒有被清除,所以這時候調(diào)用clearInterval(timer)清除的只是最后一個被創(chuàng)建的定時器對象罷了。
使用上面的例子就可以簡單的用肉眼觀察效果,先點(diǎn)擊一次啟動觀察速度,再點(diǎn)擊第二次,會看到速度有明顯的提升,這時候使用清除功能,速度就會回到第一次啟動的狀態(tài),但是多次點(diǎn)擊清除是沒有用的,如果想看準(zhǔn)確的結(jié)果可以將時間打印出來進(jìn)行比較。
解決方法
看到這里,答案呼之欲出了,很簡單,在每次初始化定時器之前先執(zhí)行清除操作,保證之前的定時器被清除了就不會發(fā)生越走越快的情況,所以其實(shí)并不是定時器越走越快,而是有多個定時器在執(zhí)行,定時器里面的程序執(zhí)行的頻率提高了。
window.onload = function () {
var i = 0;
var timer;
document.getElementById("btnStart").onclick = function () {
clearInterval(timer);
timer = setInterval(
function () {
i++;
document.getElementById("lblShowNum").innerText = i;
}, 1000);
}
document.getElementById("btnClear").onclick = function () {
clearInterval(timer);
}
}
總結(jié)
以上所述是小編給大家介紹的輕松解決JavaScript定時器越走越快的問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
使用JSON格式提交數(shù)據(jù)到服務(wù)端的實(shí)例代碼
這篇文章主要介紹了使用JSON格式提交數(shù)據(jù)到服務(wù)端的實(shí)例代碼,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下2018-04-04
使用 Opentype.js 生成字體子集的實(shí)例代碼詳解
這篇文章主要介紹了使用 Opentype.js 生成字體子集,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Locate a File Using a File Open Dialog Box
Locate a File Using a File Open Dialog Box...2007-06-06
擁有一個屬于自己的javascript表單驗(yàn)證插件
這篇文章主要幫助大家擁有一個屬于自己的javascript表單驗(yàn)證插件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03
JS實(shí)現(xiàn)數(shù)組的增刪改查操作示例
這篇文章主要介紹了JS實(shí)現(xiàn)數(shù)組的增刪改查操作,結(jié)合實(shí)例形式分析了javascript針對數(shù)組的追加、獲取、刪除、添加、修改等常見操作技巧與相關(guān)注意事項,需要的朋友可以參考下2018-08-08

