Javascript jQuery函数:为什么第一个事件的完成会延迟到第二个事件完成?
这困扰了我很多年,所以我创建了一个测试来说明这种情况 代码如下:Javascript jQuery函数:为什么第一个事件的完成会延迟到第二个事件完成?,javascript,jquery,function,timing,Javascript,Jquery,Function,Timing,这困扰了我很多年,所以我创建了一个测试来说明这种情况 代码如下: $('#test').on('click', function() { $(this).css('background', 'red'); for (var i = 1; i < 100000; i++) { var el = document.createElement("div"); el.innerHTML = "Another"; document.ge
$('#test').on('click', function() {
$(this).css('background', 'red');
for (var i = 1; i < 100000; i++) {
var el = document.createElement("div");
el.innerHTML = "Another";
document.getElementById("container").appendChild(el);
}
});
在setTimeout情况下,您会在2秒后看到瞬时红色,然后是蓝色。编辑:这是第二种情况的答案
为什么我的第一把小提琴会这么做?它适用于许多其他情况,特别是关于AJAX。我尝试过对其进行简单的修改。在循环运行之前,颜色确实会发生变化。检查是否减少了循环迭代次数。我尝试了对其进行简单修改。在循环运行之前,颜色确实会发生变化。检查是否减少了循环迭代次数。在整个函数执行之前,浏览器不会触发重新绘制 您可以在调用for循环之前重新绘制,方法是将for包装在一个超时为零的setTimeout中,如下所示:
$('#test').on('click', function() {
$(this).css('background', 'red');
setTimeout(function(){
for (var i = 1; i < 100000; i++) {
var el = document.createElement("div");
el.innerHTML = "Another";
document.getElementById("container").appendChild(el);
}
}, 0);
});
在整个函数执行之前,浏览器不会触发重新绘制 您可以在调用for循环之前重新绘制,方法是将for包装在一个超时为零的setTimeout中,如下所示:
$('#test').on('click', function() {
$(this).css('background', 'red');
setTimeout(function(){
for (var i = 1; i < 100000; i++) {
var el = document.createElement("div");
el.innerHTML = "Another";
document.getElementById("container").appendChild(el);
}
}, 0);
});
javascript中只有一个主线程 循环阻止一切发生,比如排队设置超时或后台重新绘制
不同之处在于,setTimeout不需要繁重的计算,因为它只是一个堆栈,所以100000次迭代循环完成得更快,并允许在这种情况下执行下一个排队函数,即重新绘制 循环阻止一切发生,比如排队设置超时或后台重新绘制
不同之处在于,setTimeout不需要大量计算,因为它只是一个堆栈,所以100000次迭代循环完成得更快,并允许下一个排队函数(在这种情况下)执行重绘。Pipalayan Nayak的答案也出于同样的原因。触发重新粉刷的是提醒。皮帕拉扬·纳亚克的回答也是出于同样的原因。触发重新绘制的是对警报的调用。如果您删除警报并再次增加迭代次数,它仍然会延迟颜色更改。正如@market所指出的,正是该警报使其“触发重新绘制”。如果您删除该警报并再次增加迭代次数,它仍然会延迟颜色更改。正如@market所指出的,正是这个警报“触发了重新粉刷”。