18910140161

JavaScript-脚本执行期间的浏览器回流-堆栈溢出

顺晟科技

2022-10-18 13:56:47

240

不清楚浏览器是在脚本运行时还是在执行后启动回流。所以基本上,如果我有一个循环(100次迭代),将一个元素插入到DOM中,浏览器停止脚本执行,用插入的元素重新计算布局,在每一步中重新绘制。然后下一步就来了。或者它不停地插入100个元素,然后回流?

要将其转换为代码,这两种代码之间是否有任何性能差异?

for(let i = 0; i < 100; i++){
   $('body').append('<div>SOmething....</div>')
}

还是更好?

let a = $('<div></div>');
for(let i = 0; i < 100; i++){
   $(a).append('<div>SOmething....</div>')
}
$('body').append(a)

或者,有没有一种更好、更有效的解决方案,可以在DOM中插入大量元素(10000个甚至更多),而不会降低浏览器的速度?


顺晟科技:

现代浏览器中,只有在需要的时候才会发生回流,也就是说,要么是在空闲时间(Safari),要么是在下一次画图之前(在Chrome和Firefox中,或者Safari中,如果之前没有空闲的话),或者是在调用少数几个强制回流的方法之一时(更多细节见的回答)。

对DOM的

每一次修改都不会强制自己进行回流,在您的代码中,在下一次重绘之前只会发生一次。

然而,附加到DOM本身确实会带来一些成本,因此,是的,两种代码之间存在性能差异,但这种差异将是最小的。

附加到DocumentFragment可能更好,在某些情况下,构建一个巨大的标记字符串确实更快,但您确实应该重新考虑附加10000个元素的需要。相反,你有没有考虑过分页系统,或者无限滚动系统?通过这种方式,您每次只需附加整个内容的一小部分,让浏览器呼吸并处理内存压力。至少,您可以考虑按批附加元素,并使用setTimeout让事件循环在每个批之间实际循环(并且浏览器呈现它所能呈现的内容)。

  • TAG:
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航