我做了一個(gè)倒計(jì)時(shí)計(jì)時(shí)器,達(dá)到的效果是點(diǎn)擊元素,觸發(fā)計(jì)時(shí)器,倒計(jì)時(shí)5秒后,清除計(jì)時(shí)器。再次點(diǎn)擊,再次觸發(fā)計(jì)時(shí)器(這一步還沒(méi)有測(cè)試),問(wèn)題在上一步——清除計(jì)時(shí)器后,計(jì)時(shí)器仍然還是運(yùn)作,代碼如下:
var time=5;//初始化倒計(jì)時(shí)秒數(shù)
var timer;//定義計(jì)時(shí)器 yanz.onclick=function(){ var timer=window.setInterval("daoshu()",1000);//觸發(fā) } function daoshu(){ yanz.style.fontSize="12px"; yanz.innerHTML="短信已發(fā)送,"+time+"s內(nèi)有效"; time--;//倒計(jì)時(shí) if(time<=0){//計(jì)時(shí)完畢 Stop();//清除計(jì)時(shí)器 yanz.style.fontSize="18px"; yanz.innerHTML="點(diǎn)擊獲取短信驗(yàn)證碼"; } console.log(time);//這里能看出,該計(jì)時(shí)器并未被清除,任然在運(yùn)作 } function Stop(){ window.clearInterval(timer);//清除計(jì)時(shí)器 } 大神指點(diǎn)一下,問(wèn)題出在哪里了?
這是的timer永遠(yuǎn)是個(gè)局部變量,stop里面清除的是全局的timer,然后全局的timer始終是null,在跑的始終是局部的timer,所以你應(yīng)該知道錯(cuò)誤在哪了
因?yàn)樵谶@個(gè)匿名函數(shù)里面又重新申明了一個(gè)變量,所以window對(duì)象下的timer是null,onlcick里面的timer匿名函數(shù)內(nèi)部的一個(gè)變量,兩個(gè)不在共同層級(jí),所以你要去掉var
倒計(jì)時(shí)參考代碼
var timer;//定義計(jì)時(shí)器yanz.onclick=function(){ var timer=window.setInterval("daoshu()",1000);//觸發(fā)}timer定義了兩次
此外,建議題主在設(shè)置timer之前先把timer清掉,防止二次點(diǎn)擊,產(chǎn)生加速的情況
用法