【问题标题】:Very slow reflow/layout in Internet ExplorerInternet Explorer 中的重排/布局非常慢
【发布时间】:2017-11-01 03:23:42
【问题描述】:

我必须动态构建一个包含 +450 行/+90 列的表,并在 Internet Explorer 中显示它。在过去的两天里,我一直在进行大量优化,最终将表格行的集合创建为一个非常长的字符串,并将其分配给表格的 tBody 的 innerHTML。

它在 Chrome/Mozilla 中运行良好,重排大约需要 0.2 秒,但在 Internet Explorer 中非常慢。渲染大约需要 4 秒(我说“大约”,因为如果控制台打开(用于时间测量),渲染需要 19 秒)。另一个问题是 IE9 及以下版本甚至不支持 innerHTML。所以问题是:在 IE9 中尽可能快地呈现大量 HTML 的最快方法是什么?
HTML 示例:

<tr class="data-row" ><td class="hidden" style="width: -21px; padding: 
10px;">"1"</td><tdclass="structureCatagory" style="width: 119px; padding: 
10px;">"0381"</td><td class="structureCatagory" style="width: 139px; 
padding: 10px;">"Some text"</td><td class="structureCatagory" 
style="width: 139px; padding: 0px;"><img src="/Content/Images/info.png" 
onclick="Interface.OnImageClicked($(this))" ></td>...

以此类推,总共 4178521 个字符。
Javascript:

function Update() {
    var displayData = Model.GetData();
    if (displayData == undefined || displayData.length == 0)
        return false;
    var rows = "", len = displayData.length;
    for (var i = 0; i < len; i++) rows += GetRow(displayData[i]);
    //until here it's very fast
    GlobalQueries.dataTableBody[0].innerHTML = rows;
    //^ this line takes alot of time
    return true;
}

提前致谢!
编辑:表格本身:

<div class="grid">
    <table class="fixed">
        <tbody></tbody>
    </table>
</div>
<style>
    .grid { margin-top: 240px; margin-left: 10px; }
    .grid td, .header-row td { border: 1px solid black; }
    table.fixed { table-layout: fixed; }
</style>

【问题讨论】:

  • 您是否尝试过 a) 从空表开始 b) 将属性/内容分配给个人 &lt;td&gt;s?
  • 您可以尝试修复 table-layout,我认为通常它会等待整个表格加载,然后再渲染,与固定布局一样,它会在加载时渲染,除了我建议使用插件,这样您就可以对其进行分页,因为没有人希望看到有 450 行和 90 列的表格!
  • @ChrisG 一次分配每个单一属性可能需要 43,338 倍的时间,因为它每次都必须重排。 @Pete 它的布局已经固定。我想它已经一次性渲染了,因为与 DOM 的唯一联系是在 GlobalQueries.dataTableBody[0].innerHTML = rows
  • it takes about 4 seconds to render ... for a total of 4178521 characters 让我反悔一下:IE needs almost 4 seconds to parse and render a 4MB html-file。还有第二个提示:仅仅因为你没有看到一个元素并不意味着浏览器不必在每次滚动时都渲染它。 450000+ DOM 节点在每个滚动条上呈现。也许它在屏幕外,也许它被某事重叠。否则,可能会重新定位......浏览器只“知道”节点的可见内容以及屏幕上的位置,渲染后节点。
  • 很抱歉我用错了几次词...我的英语还不够完美。在所有三个浏览器中测试后,我这样理解:首先,一切都在不到一秒的时间内顺利进行(页面加载、js 执行、4178521 个字符的长字符串被构建)。然后是GlobalQueries.dataTableBody[0].innerHTML = rows 部分。现在需要对其进行解析:在 chrome/mozilla 中需要 200 毫秒,但在 Internet Explorer 中需要 4 秒。您所说的“渲染”(在每个滚动条上)是在那之后发生的,并且在所有三个浏览器中都非常顺利地发生。问题是——

标签: javascript html internet-explorer internet-explorer-9 reflow


【解决方案1】:

我认为只有惰性渲染才能在这里为您提供帮助。这样,您将减少页面上 HTML 节点的数量并使其更轻。您不需要渲染屏幕上不可见的行...

有 jQuery、React、Polymer 等的例子。

为了使绘制看起来更快,您可以批量插入,而不是一次插入整个表格,而是使用 requestAnimationFrame 等方法分块插入。

【讨论】:

  • 我会试试的,谢谢你的回答。但只是另一件事:我不能再使用innerHTML,因为它不能与IE9 中的tBody 一起使用,当然也不能用于延迟加载。问题是:在这种情况下,追加 HTML 的最快方法是什么? jQuery 的 .append() 是一个选项吗?有没有更快的原生js?感谢您的回复!
  • 使用 .empty().append() 而不是 .innerHTML 进行延迟加载,谢谢!
  • 是的 -> Element.insertAdjacentHTML()
猜你喜欢
  • 2017-04-11
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
相关资源
最近更新 更多