重新计算风格:为什么这么口吃?

2023-12-19

假设我们有一段代码将一系列相似的元素注入到 DOM 中。像这样的东西:

var COUNT = 10000,
    elements = Object.keys(Array(COUNT).join('|').split('|'));

var d = document, 
    root = d.getElementById('root');

function inject() {
    var count = COUNT,
        ul     = d.createElement('ul'),
        liTmpl = d.createElement('li'),
        liEl   = null;

    console.time('Processing elements');
    while (count--) {
        liEl = liTmpl.cloneNode(false);
        liEl.textContent = elements[count];
        ul.appendChild(liEl);
    }
    console.timeEnd('Processing elements');

    console.time('Appending into DOM');
    root.appendChild(ul);
    console.timeEnd('Appending into DOM');
};
d.getElementById('inject').addEventListener('click', inject);

Demo http://jsfiddle.net/6D7sM/.

当此代码片段在 Firefox (25.0) 中运行时,调用“inject”和实际看到其结果之间的时间或多或少对应于记录的内容time/timeEnd。对于1000个元素,大约4毫秒; 10000,大约40等等。很正常,不是吗?

然而,对于 Chrome(30.0 和 Canary 32.0 已进行测试),情况并非如此。虽然报告的处理和附加时间实际上比 Firefox 少,但渲染这些元素需要更多时间。

困惑的是,我检查了 Chrome 的分析器是否有不同的场景 - 结果发现瓶颈在于重新计算样式操作。 10000 个节点需要 2-3 秒,20000 个节点需要 8 秒,30000 个节点则需要 17 秒。


现在真正的问题是:有人遇到过同样的情况吗?有解决方法吗?

我们考虑过的一种可能的方法是以某种延迟加载(“某种”,因为它更多的是“延迟显示”)来限制这些节点的可见性:元素已经就位,只有它们的可见性会被改变。有限的)。已确认仅当元素即将变得可见时才会触发“重新计算样式”(实际上这是有道理的)。


看起来问题出在li具有的元素display:list-item

如果代替ul/li你用div元素在 chrome 中运行得非常快..

还创建了一个CSS规则li{display:block;}修复延迟。

并手动添加list-item即使元素已经在 DOM 中渲染(当然,它们必须重新渲染)

请参阅演示:http://jsfiddle.net/6D7sM/1/ http://jsfiddle.net/6D7sM/1/

(所以看来chrome渲染速度很慢display:list-item元素)


还有一个相关的bug提交给chromehttp://code.google.com/p/chromium/issues/detail?id=71305 http://code.google.com/p/chromium/issues/detail?id=71305已合并到http://code.google.com/p/chromium/issues/detail?id=%2094248 http://code.google.com/p/chromium/issues/detail?id=%2094248 (看起来在早期版本中它会使 chrome 崩溃,但它已被修复。是碰撞,而不是速度)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新计算风格:为什么这么口吃? 的相关文章

  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 如何在使用页面锚点导航时设置“激活”类以在 Angular 2 中引导导航栏?

    我正在使用 Angular 2 和 Bootstrap 4 创建一个单页网站 我创建了一个始终位于页面顶部的导航栏组件 并且我正在使用页面锚点导航 id 请注意 我还没有创建路由模块 到目前为止还没有必要这样做 导航栏代码如下
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • 如何阻止破折号自行包裹?

    我有一个标题 标题最后一个单词的末尾是一个破折号 单词和破折号之间没有空格 当浏览器窗口变小时 破折号会中断并换成新行 在自己的行上有一个破折号是不好的排版 如何停止破折号之前的换行 以便最后一个单词运行到新行 这是代码 h1 XYZ co
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 避免响应式页面的重复内容

    我目前正在做一个涉及响应式设计的项目 整个布局应该使用HTML和CSS来实现 我知道可以使用 java 脚本将内容从一个列布局移动到另一列布局 而无需复制内容 但是使用 HTML 和 CSS 是否可以实现相同的效果 以下面的例子为例 它会在
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • 指针事件:无,过滤,适用于 ie8 和任何地方,不适用于 ie9

    正如我在这里看到的 https stackoverflow com questions 3680429 click through a div to underlying elements 4839672 4839672 过滤器可用于模拟跨
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 更改文本输入标签中文本的大小?

    我有一个很大的文本输入框 但我无法更改字体大小
  • 带有相对路径的 LESS CSS 背景

    我在使用 LESS 作为我的网站的样式表时遇到了问题 就我个人而言 我宁愿在CSS中使用相对路径而不是绝对路径 这只是我的习惯 但是现在当我使用带有导入功能的LESS时 我遇到了如下所示的问题 我有一个main less根文件夹中的文件 i

随机推荐

  • 如何显示 DOMElement?

    我在用着可读性 http bazaar launchpad net keyvan k1m fivefilters content only annotate head readability php的代码从网页中提取 HTML 如何将其显示
  • str.split() 的分割顺序有任何保证吗?

    根据Python 2 7 文档 https docs python org 2 7 library stdtypes html str split using str split with maxsplit指定将字符串拆分为maxsplit
  • 删除所有 PostgreSQL 视图

    如何使用查询从 PostgreSQL 删除所有用户定义的视图 就像我们可以使用查询删除所有函数 SELECT DROP FUNCTION ns nspname proname oidvectortypes proargtypes FROM
  • 在 C# 中将 XML 字符串解析为类? [复制]

    这个问题在这里已经有答案了 可能的重复 如何反序列化 XML 文档 https stackoverflow com questions 364253 how to deserialize xml document 假设我有一个在 C 中定义
  • 以编程方式更改数据后重新渲染 ng2-google-chart

    我在用ng2 google chart而且效果很好 现在我想使用一些复选框来选择图表中显示哪些数据 我的图已连接到数组chartData 选择后更新正确 但图表没有改变 这是我的图表 div div 有没有办法在数据更改后重新渲染它 同时我
  • 设置在 Spring MVC 中不起作用

    PROBLEM 我想向用户显示自定义错误页面 简而言之
  • 如何访问 Knockout 组件中的自定义元素?

    看看这个场景 ko components register hello viewModel function template h1 hello wrold h1 如果我使用
  • 卡夫卡生产者批量大小

    我有一个相关问题batch size生产者配置 当发生什么batch size已经达到并且生产者应用程序线程发送更多数据 线程是否会阻塞 直到包含批处理的缓冲区中的空间可用为止 batch size以总字节数而不是消息数来衡量批量大小 它控
  • 如何使用 RSpec 在 Rails 测试环境中加载 Seed.rb?

    我有以下 seeds rb 文件 State create name gt Alabama abbreviation gt AL name gt Alaska abbreviation gt AK name gt Arizona abbre
  • CSS ::before ::after 类的伪元素不起作用

    我正在尝试添加一个 before and after菜单标题的伪元素 伪元素对于菜单外的常规链接效果很好 但是 当我尝试将它们应用到菜单项时 background属性已设置 但 before and after属性不是 这是相关的CSS c
  • Rails 资产用于开发而非生产

    古老的 我不懂链轮 问题 我在 app assets javascript jquery fancybox js 中有一个资产 我使用 来访问 加载它 这在开发中有效 但在生产中无效 我正在查看日志 但那里肯定发生了一些事情 因为我看不到它
  • Azure B2C 自定义重置密码策略

    我在 B2C 中有一些正在发挥作用的自定义策略 但我并没有尝试让重置密码发挥作用 我遇到的问题之一是 我调用 Restful API 来检查提供的电子邮件地址是否是本地用户 或者我们是否从 Microsoft AAD 登录它们 这工作正常
  • 如何在shiny中加载csv文件的文件夹

    我有一个 CSV 文件的文件夹 我想将它们作为闪亮的文件列表上传和访问 我尝试使用以下代码来上传文件 server output sourced lt renderDataTable inFile lt input file1 if is
  • ember.js + 把手:渲染 vs 出口 vs 部分 vs 视图 vs 控制

    每个周围都有分散的解释 但我仍然不是 100 清楚它们的差异和用法 有人可以给我一个横向比较吗 outlet outlet NAME render partial view control Note 这个帖子 https stackover
  • Grails WAR 热部署导致的“call 'refresh'”错误

    当我的 Grails WAR 热部署到 Tomcat 并刷新页面时 出现以下错误 2010 年 2 月 1 日 7 00 51 PM org apache catalina core ApplicationDispatcher 调用 严重
  • 具有多个条件的 if 的执行顺序

    在具有多个条件的 if 语句中 如果第一个条件的结果明确 是否会执行第二个条件 example if i gt 0 array i 0 如果我交换条件 i 的负值可能会发生段错误 但这样就不会发生段错误 我可以确定这总是有效还是必须使用嵌套
  • groovy.json.JsonException:期待“}”或“,”但获得当前字符

    我正在尝试让一段代码为我工作 但运气不佳 所以我把代码分解成这个让我悲伤的小片段 任何人都可以帮助确定为什么会发生这个错误 import groovy json JsonSlurper String index accessCode d20
  • Firestore - 创建集合的副本

    所以我有一个名为 草稿 的集合 其中包含多个文档 每个文档都有一个自动 ID 每个文档包含字段 名称 和 详细信息 每个文档都显示在 nameLabel 和 detailsLabel 下的 tableViewCell 中 我想做的是 当用户
  • 如何更改android中EditText提示的字体?

    正如我在问题中提到的 我正在尝试更改 EditText 中提示的字体 但我似乎无法实现它 这是我的 EditText 获取用户名的代码
  • 重新计算风格:为什么这么口吃?

    假设我们有一段代码将一系列相似的元素注入到 DOM 中 像这样的东西 var COUNT 10000 elements Object keys Array COUNT join split var d document root d get