JavaScript设置超时0阻止页面呈现?
根据这个问题 更改DOM是同步的。呈现DOM实际上是在清除JavaScript堆栈之后发生的 根据google doc,屏幕刷新速率60fps相当于大约每16ms刷新一次,我写了这个例子:JavaScript设置超时0阻止页面呈现?,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,根据这个问题 更改DOM是同步的。呈现DOM实际上是在清除JavaScript堆栈之后发生的 根据google doc,屏幕刷新速率60fps相当于大约每16ms刷新一次,我写了这个例子: <!DOCTYPE html> <html> <head> <script> document.addEventListener('DOMContentLoaded', function() {
<!DOCTYPE html>
<html>
<head>
<script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelector('#do').onclick = function() {
document.querySelector('#status').innerHTML = 'calculating...';
// setTimeout(long, 0); // will block
setTimeout(long, 1); // will not block
};
function long(){
let result = 0
for (let i = 0; i < 1000; i++) {
for (let j = 0; j < 1000; j++) {
for (let k = 0; k < 1000; k++) {
result += i + j + k;
}
}
}
document.querySelector('#status').innerHTML = 'calculation done';
document.querySelector('#result').innerHTML = result.toString();
}
});
</script>
</head>
<body>
<button id='do'> Do long calc!</button>
<div id='status'></div>
<div id='result'></div>
</body>
</html>
document.addEventListener('DOMContentLoaded',function(){
document.querySelector('#do').onclick=function(){
document.querySelector(“#status”).innerHTML='computing…';
//setTimeout(长,0);//将阻止
setTimeout(长,1);//将不会阻止
};
函数long(){
设结果=0
for(设i=0;i<1000;i++){
对于(设j=0;j<1000;j++){
for(设k=0;k<1000;k++){
结果+=i+j+k;
}
}
}
document.querySelector(“#status”).innerHTML=“计算完成”;
document.querySelector(“#result”).innerHTML=result.toString();
}
});
做长计算!
用jsfiddle
我仔细研究了代码,发现阻塞发生的时间延迟在12毫秒以下,并且发生的频率更高,延迟更小
我有两种不同的理解方式:
setTimeout
不应阻塞,延时0和1远小于16ms,因此两者都应阻塞setTimeout
调用和long
推送到消息队列(可选延迟)之后,现在调用堆栈为空,因此在这两种情况下setTimeout
都不应阻塞,并且始终呈现“计算…”我的理解有什么问题?这可能与你的工作有关
它看起来好像大多数浏览器都忽略了0的值,可能值得查看浏览器的
DOM\u MIN\u TIMEOUT\u值。这可能与您的浏览器有关
它读起来好像大多数浏览器都忽略了0的值,可能值得查看浏览器的DOM\u MIN\u TIMEOUT\u值。谢谢reddington,这正是我要找的!请详细说明ad MDN提供的信息。如果没有链接,您的答案无法提供足够的信息。至少引用相关信息。谢谢雷丁顿,这正是我要找的!请详细说明ad MDN提供的信息。如果没有链接,您的答案无法提供足够的信息。至少引用相关信息。