当前位置: 首页 > 知识库问答 >
问题:

脚本执行期间浏览器回流

俞俊逸
2023-03-14

我不清楚浏览器是在脚本运行时还是在执行后启动回流。因此,基本上,如果我有一个循环(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个或更多),而不会使浏览器的速度降低那么多?

共有1个答案

席嘉祯
2023-03-14

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

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

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

附加到DocumentFragment可能更好,在某些情况下,构建一个巨大的标记字符串的速度确实更快,但您确实应该重新考虑是否需要附加10000个元素
相反,您考虑过分页系统还是无限滚动系统?通过这种方式,每次只附加一小部分,让浏览器呼吸并处理内存压力。至少,您可以考虑批处理添加html" target="_blank">元素,并且让事件循环实际上循环(并且浏览器在每个批次之间使用<代码> SETTimeOuts)。

 类似资料:
  • 网站会话在脚本执行期间过期。我有4门课,有15-16种测试方法。而我使用测试中的数据作为一个套件来执行所有操作。xml。 场景:在用户登录后执行搜索 我使用以下条件 所以我的问题是: 是我的网站问题还是网络驱动问题? 为什么会话会在页面导航上获得注销?我已经尝试了和,但没有成功。 有没有人能给我一个这样的问题的线索?

  • 虽然 Selenium IDE 只能运行在火狐浏览器上,但是 Selenium IDE 开发的测试案例却可以运行在其他浏览器上。使用一个简单的命令行接口来调用 Selenium RC 服务器。这个话题在Selenium RC 运行 Selenese 测试部分章节有介绍。-htmlSuite 命令行选项是跟这个特定功能相关的。

  • 尽管 ASP 主要用来创建和处理服务器端脚本,还是可以使用它生成由客户浏览器处理的客户端脚本来扩展其效用。通过组合传送到浏览器的脚本命令可以编写服务器端脚本。 通过组合由 HTML 注释括起来的客户端脚本和由定界符括起来的服务器端脚本可以做到这一点: <SCRIPT LANGUAGE="VBScript"> <!-- client script <% server script %> cli

  • 我希望在启动Spring boot应用程序时始终运行SQL脚本。我添加了这个液化酶配置: application.yml db。变更日志主机。亚马尔 变更日志。亚马尔 data.yaml data.sql 数据库表应该填充测试数据,但事实并非如此。我看不到日志data.sql文件执行。 你知道问题出在哪里吗?

  • 问题内容: 我有一个批处理文件,该文件在sqlplus中运行一个SQL脚本,并将输出发送到日志文件: sqlplus用户/密码 RowCount.log 我的日志文件包含以下内容: 等等,但是它有数千行输出,因此很难确定哪个结果属于哪个语句。 我想在输出中添加一些格式,以便我可以识别发生了什么。可以对执行的语句进行回显,也可以在脚本中手动插入一些“ echo”语句。理想情况下,它看起来像这样: 问

  • 我将@DataProvider用于Selenium on Java and TestNg项目,特别是用于实现saucelabs所需功能的TestBase类。我担心的是,这段代码返回“NullPointerException”错误,因为数据提供程序值从未被接受。有人能指出我的代码有什么问题吗(使用与示例相同的代码:https://github.com/saucelabs-sample-test-fr