Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery函数:为什么第一个事件的完成会延迟到第二个事件完成?_Javascript_Jquery_Function_Timing - Fatal编程技术网

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所指出的,正是这个警报“触发了重新粉刷”。