【问题标题】:Performance: large table mousehover effects性能:大表鼠标悬停效果
【发布时间】:2015-04-15 14:29:25
【问题描述】:

HTML

<table>
    <tr data-parent="0" data-id="1">
        <td></td>
    </tr>
    <tr data-parent="1" data-id="2">
        <td></td>
    </tr>
    <tr data-parent="1" data-id="3">
        <td></td>
    </tr>
    <tr data-parent="3" data-id="4">
        <td></td>
    </tr>
</table>

其中data-parent 指向另一行的data-id

JQUERY/JS

$("tr[data-parent='" + id + "']").css("background-color", "#1ba1e2").each(function () {
    $("tr[data-parent='" + $(this).attr("data-id") + "']").css("background-color", "#75F7FF").each(function () {
        $("tr[data-parent='" + $(this).attr("data-id") + "']").css("background-color", "#98E8E3").each(function () {
            $("tr[data-parent='" + $(this).attr("data-id") + "']").css("background-color", "#B6DCE8")
    });});});

(我知道我也可以写一个递归函数,现在不是重点)

当有人将鼠标悬停在 TR 上时,我希望该行是一种颜色,所有以悬停行为父行的行,另一种颜色,孙子另一种颜色等(深几级)。

现在,对于 100 行,这不是问题,但我的数据包含大约 30 000 行,这就是它开始出错的地方,几秒钟的冻结错误。

如何优化这段代码?

为了您和我的方便:一个 jsFiddle! http://jsfiddle.net/dawdg4sj/

【问题讨论】:

  • 我建议如果您有 30,000 行,您应该考虑将其作为可搜索/可分页列表。将这么多数据呈现给用户会适得其反。
  • 能否对数据进行预处理,使每一行都具有属性data-ancestor-&lt;n&gt;,其中n 标记相对于当前节点的代数?因此,您可以避免显式迭代(例如,使用$("tr[data-ancestor-2='" + $(this).attr("data-id") + "']").css("background-color", "#98E8E3");this 的孙子着色)。
  • @RoryMcCrossan 我知道数据过多的问题,我们正在积极寻找更好的方法来缩小数据池,但现在,我们必须处理给定的内容,恐怕。

标签: javascript jquery html performance


【解决方案1】:

首先,单个表中有 30'000 行是一个可用性问题;一些浏览器甚至无法很好地处理这样的怪物。想办法缩小尺寸。

现在有一些解决方案。

您可以使用id 代替data-id。浏览器为具有 ID 的元素保留一个有效的查找表。在 jQuery 中,您可以使用 $('#'+id) 查找非常快的 DOM 节点(无需扫描整个树,如果您有 30K 行,这将是巨大的)。

如果您不能这样做,则将引用保存在 JavaScript 对象中,您可以在其中通过简单的键查找获取父/子,即lookup[parentId] 应返回带有此parentId 的 TR 节点。这意味着解析表一次或根本不使用data 属性。

另一种方法是使用 jQuery 的 data() 函数,它允许您将任意值附加到 DOM 节点。这样,您可以在 DOM 节点中查找相关节点并保留引用,而不是每次都搜索整个文档。

最后,层数和每层的节点数对性能有很大的影响。您的算法是 O(N1*N2*N3*N4*...*NM) (其中 M 是级别数)。因此,如果您有 N2=5、N2=3、N3=4,那么您已经必须处理 5*3*4*... 节点。无论您如何查找,在一个巨大的文档中更改 1000 个节点都是昂贵的。

【讨论】:

  • 谢谢,这个,结合 codereview 的人告诉我的,应该给我足够的改进来解决问题。我们也在寻找减少行数的方法。
猜你喜欢
  • 2013-05-06
  • 2013-11-23
  • 2014-09-30
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2010-12-04
相关资源
最近更新 更多