javascript - Loop blocks DOM manipulating code before it
问题描述
Here I use the loop code(learned from What's the equivalent of Java's Thread.sleep() in JavaScript?) to simulate web latency to check my loading animation effect. However, the first line is blocked for 5 seconds too. while the second line(the log statement) isn't. What's happening?
main.innerHTML += '<div id="animation-container"></div>'
console.log("??????????");
var e = new Date().getTime() + (5 * 1000);
while (new Date().getTime() <= e) {}
main.innerHTML += 'real content'
解决方案
浏览器在一个线程中运行(它不是,但为了简单起见我们假设)。在该线程上运行多个引擎,一个用于 CSS 和 HTML,一个用于 JavaScript。
main.innerHTML += '<div id="animation-container"></div>'
console.log("");
这两个语句有很大的不同:日志记录由 JavaScript 引擎完成,而 DOM 突变被发送到 HTML 引擎。现在发送是异步的,因为 HTML 引擎当前没有像 JavaScript 引擎那样运行,因此突变将在某种队列中结束。现在您阻塞了 JavaScript 引擎,因此也阻塞了浏览器线程,因此 HTML 引擎无法获得更新视图的处理时间。
结论:不要编写阻塞式 JavaScript!利用其异步特性和浏览器工具(DevTools > Latency)。
推荐阅读
- javascript - 谁能告诉我这个javascript函数是如何工作的?
- java - Spring 3.1.1 中的 @Configuration 标记给出 java.lang.IllegalStateException
- python - Brython:我如何获得包裹(数学、时间等)
- kibana - Kibana Watcher 到 Slack 调用导致 400
- docker - 使用 docker compose 和 nginx 进行多网络路由
- java - Spring Cloud Vault 从错误的配置文件中获取属性
- c++ - enable_shared_from_this 返回 bad_weak_ptr 错误
- bash - 用于删除 name_date 超过 90 天的文件夹的 bash 脚本
- yarnpkg - Yarn UI 日志不可用,因为应用程序时间线服务似乎不健康
- php - 如何使用 if 和 else 检查查询