javascript - 浏览器渲染和 javascript 执行的同步/异步特性

标签 javascript jquery asynchronous

我有一些处理需要几秒钟,所以我想在处理过程中添加一个视觉指示器。

.processing
{
  background-color: #ff0000;
}

<div id="mydiv">
  Processing
</div>

脚本:

$("#mydiv").addClass("processing");
// Do some long running processing
$("#mydiv").removeClass("processing");

我天真地以为类会应用到div上,UI会更新。但是,在浏览器(至少在 Firefox 中)运行它时,div 永远不会突出显示。有人可以向我解释为什么我的 div 永远不会突出显示吗?添加类,进行处理,然后删除类;用户界面不会在此期间更新,用户永远不会看到红色背景。

我知道 JS 是单线程的,但我一直假设浏览器渲染会在 DOM 更新时同步运行。我的假设不正确吗?

更重要的是,实现这种效果的推荐方法是什么?我是否必须使用 setTimeout 来使缓慢的处理异步并使用回调?必须有更好的方法,因为我真的不需要这里的异步行为;我只想刷新 UI。

编辑:

JSFiddle:http://jsfiddle.net/SE8wD/5/

(请注意,您可能需要调整循环迭代次数,以便在您自己的 PC 上获得合理的延迟)

最佳答案

您可能应该将处理放在一个单独的事件中,就像这样;

$("#mydiv").addClass("processing");
setTimeout(function(){
   // This runs as a seperate event after
   // Do some long running processing
   $("#mydiv").removeClass("processing");
},1);

这样浏览器应该使用processing重绘屏幕,而长时间运行的步骤将作为一个单独的事件启动,并在完成后删除处理消息。

关于javascript - 浏览器渲染和 javascript 执行的同步/异步特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9838003/

相关文章:

javascript - 用鼠标拖动滚动条时不触发Mousemove事件

javascript - 关于 JQuery Mobile 的两个问题

multithreading - 加入第一个完成的线程?

javascript - 从 Url 中提取单词

javascript - 我如何模拟文本字段中的退格操作?

javascript - 使用 CSS flexbox 面板和 javascript

javascript - 从 document.getSelection() 获取多个元素

javascript - Bootstrap 2 折叠图标没有变化

c# - 当您使用 async-await 时,我在何处定义任务以及在何处等待它是否重要?

c# - .NET 中 yield 和 await 如何实现控制流?