關(guān)鍵代碼如下:
var sec = 10;
var t = setInterval(function(){
sec--;
$(".time").html(sec);
if(sec == 0){
alert("游戲結(jié)束,你的得分是" + score);
clearInterval(t);
}
},1000)
當(dāng)?shù)褂?jì)時(shí)到最后1秒的時(shí)候,會(huì)先彈出對(duì)話框,此時(shí)頁(yè)面上顯示的時(shí)間還是1s,等點(diǎn)擊確定后才會(huì)變成0。
我想要的效果是頁(yè)面上顯示倒計(jì)時(shí)為0的時(shí)候顯示彈出,而且點(diǎn)擊確定后時(shí)間不會(huì)變成-1,請(qǐng)問怎么實(shí)現(xiàn)呢?
這是我的想法,直接復(fù)制粘貼運(yùn)行便可看到效果,希望能幫助到你:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<div class="time"></div>
<script>
var sec = 4;
$(".time").html(sec);
var t = setInterval(function(){
if(sec == 1){
clearInterval(t);
alert("確認(rèn)或關(guān)閉彈窗變?yōu)?");
$(".time").html(0);
} else {
sec--;
$(".time").html(sec);
}
},1000)
</script>
</body>
</html> var sec = 3;
var t = setInterval(function() {
sec--;
$(".time").html(sec);
if (sec == 0) {
setTimeout(function() {
alert("游戲結(jié)束,你的得分是" /*+ score*/ )
}, 0);
clearInterval(t);
}
}, 1000);
分析:
這個(gè)代碼改不難,但是涉及到兩個(gè)知識(shí)點(diǎn),題主需要了解下,
1、 修改 innerHTML 與 頁(yè)面渲染的問題
題主以為 alert() 先于 innerHTML 執(zhí)行了,實(shí)際上不是的,執(zhí)行順序還是從上往下的,先修改的 DOM 元素的 innerHTML ,然后執(zhí)行的 alert(),只不過 DOM 元素的 innerHTML 雖然改了,但是頁(yè)面的渲染并沒有進(jìn)行,因?yàn)?js 是單線程的,只有所有的代碼執(zhí)行完了之后,有空閑,才會(huì)去渲染頁(yè)面,實(shí)際上題主前面頁(yè)面的渲染都是在 if 語句執(zhí)行完后,主線程出現(xiàn)了空閑才進(jìn)行的。
咱們改個(gè)代碼,看得更清楚些:
var sec = 3;
var score = 100;
var t = setInterval(function() {
sec--;
$(".time").html(sec);
alert("游戲結(jié)束,你的得分是" + score);
if (sec == 0) {
clearInterval(t);
}
}, 1000);
這里每回都會(huì)更新頁(yè)面和alert(),代碼上先修改的 html,再 alert,但是實(shí)際運(yùn)行的時(shí)候,你會(huì)發(fā)現(xiàn),是先 alert 再渲染的 html; 所以題主產(chǎn)生了錯(cuò)覺,innerHTML 延后執(zhí)行了;
總結(jié):DOM修改是同步的,但是頁(yè)面的渲染要等主線程空閑;
2、 定時(shí)器的**工作機(jī)制**
除了主JavaScript 執(zhí)行進(jìn)程外,還有一個(gè)需要在進(jìn)程下一次空閑時(shí)執(zhí)行的代碼隊(duì)列;
定時(shí)器對(duì)隊(duì)列的工作方式是,當(dāng)特定時(shí)間過去后將代碼插入。注意,給隊(duì)列添加代碼并不意味著對(duì)它立刻執(zhí)行,而只能表示它會(huì)盡快執(zhí)行;
如果在這個(gè)時(shí)間點(diǎn)上,隊(duì)列中沒有其他東西,那么這段代碼就會(huì)被執(zhí)行;
在答案里,setTimout(fn,0)僅僅是立馬把 fn 添加到了任務(wù)隊(duì)列里,并沒有馬上執(zhí)行。
考慮兩處代碼:
setTimeout('alert(1)',0);
alert(2);
alert(3);
此時(shí)的主線程和任務(wù)隊(duì)列:
隊(duì)列里的代碼等主線程空閑時(shí)才會(huì)執(zhí)行,所以 alert(1),會(huì)等到alert(2),alert(3)執(zhí)行完畢后再執(zhí)行;
alert(1);
alert(2);
alert(3);
此時(shí)的主線程和任務(wù)隊(duì)列:
所以代碼按照從上往下的順序正常執(zhí)行;
猜測(cè),主線程在執(zhí)行完代碼后,會(huì)立馬進(jìn)行渲染,然后再執(zhí)行任務(wù)隊(duì)列里的代碼,既然是隊(duì)列,代碼執(zhí)行就是從第一個(gè)開始到最后一個(gè)結(jié)束。
所以等代碼執(zhí)行完畢主線程空閑時(shí),首先執(zhí)行的是渲染,然后執(zhí)行的 alert();
總結(jié):setTimout 是在指定間隔后,將代碼加入任務(wù)隊(duì)列里,等主線程空閑,執(zhí)行渲染,再依次執(zhí)行隊(duì)列里的代碼;
所以最前面的代碼加上 setTimeout 的作用就在于把代碼移到隊(duì)列里去了,等主線程空閑,頁(yè)面渲染,再執(zhí)行 alert();
var sec = 3;
var t = setInterval(function() {
sec--;
$(".time").html(sec);
if (sec == 0) {
setTimeout(function() {
alert("游戲結(jié)束,你的得分是" /*+ score*/ )
}, 0);
clearInterval(t);
}
}, 1000);
參考資料:
Is innerHTML asynchronous?
When does InnerHTML execute immediately?
How to detect when innerHTML is complete
JavaScript 運(yùn)行機(jī)制詳解:再談Event Loop
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。