【发布时间】: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-<n>,其中n标记相对于当前节点的代数?因此,您可以避免显式迭代(例如,使用$("tr[data-ancestor-2='" + $(this).attr("data-id") + "']").css("background-color", "#98E8E3");为this的孙子着色)。 -
@RoryMcCrossan 我知道数据过多的问题,我们正在积极寻找更好的方法来缩小数据池,但现在,我们必须处理给定的内容,恐怕。
标签: javascript jquery html performance