|
input.focus();
input.select();
時(shí), 2 多了一個(gè)延遲時(shí)間為 0 的 setTimeout 的外圍函數(shù),即:
setTimeout(function(){
input.focus();
input.select();
}, 0);
按照 JavaScript: The Definitive Guide 5th 的 14.1 所說(shuō):
在實(shí)踐中,setTimeout 會(huì)在其完成當(dāng)前任何延宕事件的事件處理器的執(zhí)行,以及完成文檔當(dāng)前狀態(tài)更新后,告訴瀏覽器去啟用 setTimeout 內(nèi)注冊(cè)的函數(shù)。
其實(shí),這是一個(gè)把需要執(zhí)行的任務(wù)從隊(duì)列中跳脫的技巧。回到前面的例子,JavaScript 引擎在執(zhí)行 onkeypress 時(shí),由于沒(méi)有多線程的同步執(zhí)行,不可能同時(shí)去處理剛創(chuàng)建元素的 focus 和 select 事件,由于這兩個(gè)事件都不在隊(duì)列中,在完成 onkeypress 后,JavaScript 引擎已經(jīng)丟棄了這兩個(gè)事件,正如你看到的例子 1 的情況。而在例子 2 中,由于setTimeout可以把任務(wù)從某個(gè)隊(duì)列中跳脫成為新隊(duì)列,因而能夠得到期望的結(jié)果。
這才是延遲事件為 0 的setTimeout的真正目的。在此,你可以看看例子 3,它的任務(wù)是實(shí)時(shí)更新輸入的文本,現(xiàn)在請(qǐng)?jiān)囋嚕銜?huì)發(fā)現(xiàn)預(yù)覽區(qū)域總是落后一拍,比如你輸 a, 預(yù)覽區(qū)并沒(méi)有出現(xiàn) a, 在緊接輸入 b 時(shí), a 才不慌不忙地出現(xiàn)。其實(shí)我們是有辦法讓預(yù)覽區(qū)跟輸入框同步地,在此我沒(méi)有給出答案,因?yàn)樯厦嫠f(shuō)的,就是解決思路,try it yourself!
JavaScript技術(shù):認(rèn)識(shí)延遲時(shí)間為0的setTimeout,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。