国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

延遲事件為0的setTimeout的真正目的

2024-07-21 02:04:19
字體:
供稿:網(wǎng)友

由 john resig 的 how javascript timers work 可以知道,現(xiàn)有的 javascript 引擎是單線程處理任務的。它把任務放到隊列中,不會同步去執(zhí)行,必須在完成一個任務后才開始另外一個任務。

讓我們看看我之前的文章:javascript的9個陷阱及評點,在第 9 點 focus pocus 中提到的問題。原作者對這個認識有所偏差,其實不只是 ie 的問題,而是現(xiàn)有 javascript 引擎對于線程實現(xiàn)的問題(關于線程,我的概念其實不多,如果不對,希望讀者多多指教)。我們通過一個例子來說明,請訪問 http://realazy.org/lab/settimeout.html. 我們來看 1 和 2。如果你能看看源代碼,會發(fā)現(xiàn)我們的任務很簡單,就是給文檔增加一個 input 文本框,并聚焦和選中。請現(xiàn)在分別點擊一下,可以看到,1 并沒有能夠聚焦和選中,而 2 可以。它們之間的區(qū)別在于,在執(zhí)行:

input.focus();
input.select();

時, 2 多了一個延遲時間為 0 的 settimeout 的外圍函數(shù),即:

settimeout(function(){
 input.focus();
 input.select();
}, 0);

按照 javascript: the definitive guide 5th 的 14.1 所說:

在實踐中,settimeout 會在其完成當前任何延宕事件的事件處理器的執(zhí)行,以及完成文檔當前狀態(tài)更新后,告訴瀏覽器去啟用 settimeout 內(nèi)注冊的函數(shù)。

其實,這是一個把需要執(zhí)行的任務從隊列中跳脫的技巧。回到前面的例子,javascript 引擎在執(zhí)行 onkeypress 時,由于沒有多線程的同步執(zhí)行,不可能同時去處理剛創(chuàng)建元素的 focus 和 select 事件,由于這兩個事件都不在隊列中,在完成 onkeypress 后,javascript 引擎已經(jīng)丟棄了這兩個事件,正如你看到的例子 1 的情況。而在例子 2 中,由于settimeout可以把任務從某個隊列中跳脫成為新隊列,因而能夠得到期望的結(jié)果。

這才是延遲事件為 0 的settimeout的真正目的。在此,你可以看看例子 3,它的任務是實時更新輸入的文本,現(xiàn)在請試試,你會發(fā)現(xiàn)預覽區(qū)域總是落后一拍,比如你輸 a, 預覽區(qū)并沒有出現(xiàn) a, 在緊接輸入 b 時, a 才不慌不忙地出現(xiàn)。其實我們是有辦法讓預覽區(qū)跟輸入框同步地,在此我沒有給出答案,因為上面所說的,就是解決思路,try it yourself!

點擊這里返回網(wǎng)頁設計 網(wǎng)頁制作 欄目

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 芜湖县| 嫩江县| 景泰县| 抚顺县| 札达县| 莱阳市| 金川县| 门头沟区| 霍山县| 孙吴县| 汾西县| 克什克腾旗| 托里县| 三原县| 汕尾市| 泰州市| 施甸县| 亳州市| 巨野县| 靖边县| 东至县| 启东市| 左贡县| 商丘市| 常德市| 旺苍县| 桃源县| 徐汇区| 德清县| 苏尼特右旗| 宝鸡市| 青神县| 吴江市| 长垣县| 吴忠市| 海盐县| 罗源县| 车致| 车致| 开平市| 大厂|