頁面上有一按鈕如下
<button onclick="index.testClick()" >开始</button>
該頁面對應的js腳本如下
var index = {
testClick: function () {
index.createBtn(function() {
index.sleep(10000);
});
},
sleep: function (n) {
var start = new Date().getTime();
while (true) {
if(new Date().getTime() - start > n)
break;
}
},
createBtn: function (func) {
var button = $('<button>测试</button>');
button.bind("click",function(){
button.remove();
func();
});
$('body').prepend(button);
},
};
為什麼點擊開始按鈕再點擊測試按鈕之後,測試按鈕實際上要sleep(是在同步的$.ajax請求上註意到的,這裡用循環模擬)之後才移除?把sleep包到setTimeout裡才能得到想要的效果…?
這個問題問得確實是有點…… 咋一看以為代碼故意sleep了10秒然而題主看不懂,透過上面評論區的撕逼大概知道是在問什麼了……
這東東跟瀏覽器UI線程有關,瀏覽器是單線程的(這個線程一般就叫瀏覽器UI線程)。
《高效能JavaScript》第六章 快速回應的使用者介面,有這麼多兩段話:
這是點擊事件的處理函數,js移除DOM節點後,func()馬上接著運行,10秒後進程空閒,才會運行下一個任務,更新用戶界面,這時候按鈕才會在頁面中消失。
上面另一個答案評論區的問題,『為什麼添加的時候就不會有這種現象』
添加的函數是這樣的,
這個過程並沒有運行func(),試試把這個函數移出來,改成這樣
一定也阻塞
應該是你阻塞了線程 使得圖形渲染也'卡'住了
即便button已從dom樹中刪除。
但是圖形沒有把新的、不存在button的dom樹重新繪製。
之前是我想的簡單了,應該是跟樓下說的一樣,畫面渲染卡住了。
例如在func();之前列印一下日誌:
出現輸出標識之後就卡住了,等到sleep執行完才把完整內容顯示出來:
sleep執行時頁面被阻塞完全不能操作了,同時CPU佔用非常高(因為這個循環理論上沒有間隔,)可能是這個導致被卡住了吧。