gpt4 book ai didi

javascript - 为什么在执行 Javascript 时没有触发浏览器的重排?

转载 作者:行者123 更新时间:2023-11-28 05:48:53 24 4
gpt4 key购买 nike

在我一直在开发的应用程序的用户界面中,我一直试图在特定(同步)处理开始之前显示“加载器”div,并在处理结束后隐藏它。然而,在整个处理过程中,加载程序根本没有出现。

我发现浏览器会在可能的情况下通过消除不必要的回流来尝试优化渲染过程。有一些方法可以手动触发回流过程(对于像我这样的情况),但我还没有设法使它们中的任何一个起作用。您可以在下面找到一个最小的示例,其中使用 offsetHeight 的计算来触发回流,但 TEST div 根本没有出现。

<html>
<head>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
</head>
<body>
<div id="test" style="display:none; background-color:red; height:500px">TEST</div>

<script>
function reflow() {
var t = $("#test")[0].offsetHeight;
$(window).trigger('resize');
window.getComputedStyle($("#test")[0], null);
$("#test").focus();
}

$("#test").show();
reflow();
console.log("Processing started");
var sum = 0;
for(i = 0; i < 100000000; i++) {
sum += i;
}
console.log("Processing ended");
$("#test").hide();
<script>
</body>
</html>

也可以使用 JSFiddle here

尝试强制回流的一些方法如下(如您在脚本中所见):

  • 元素offsetHeight的计算
  • 调整窗口大小
  • window.getCompulatedStyle()
  • 元素的焦点

注意:我知道可以通过添加超时来解决这个问题。但是,我想找到一种强制回流的方法,因为超时是一种“黑客”并且不适合此功能。

最佳答案

使用带有“0”参数的 setTimeout 进行等待,这将强制它停止足够长的时间,以便您的显示/隐藏工作。

https://jsfiddle.net/o3y60e0L/3/

$("#test").show();
var t = $("#test")[0].offsetHeight;
console.log("Processing started");
setTimeout(function() {
var sum = 0;
for(i = 0; i < 1000000000; i++) {
sum += i;
}

console.log("Processing ended");
$("#test").hide();
}, 0);

关于javascript - 为什么在执行 Javascript 时没有触发浏览器的重排?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com