Chrome - nth-child规则太慢了

时间:2014-04-02 08:20:35

标签: css3 google-chrome css-selectors pseudo-class

我一直在使用jQuery测试DOM选择性能。 将$(“ul li:nth-​​child(999)”)与$(“ul li”)进行比较后,我得到一些问题.eq(999)

$("ul li:nth-child(999)");
$("ul li").eq(999);


请点击以下链接查看我的详细测试结果:

JSPerf Test Result

特别是Chrome在操作n-child伪类时表现不佳 我想知道为什么会造成这样的结果。
我可以获得任何算法,机制或参考资料吗?

如果有人帮助我,我将非常感激 感谢。

2 个答案:

答案 0 :(得分:2)

您的测试结果很有趣。我也希望知道基础算法差异的正确答案。

不谈论这两个功能的算法,我不知道这是否有帮助。
但我认为只是功能......

首先,这两个功能略有不同。

$().eq jQuery方法。它是自己的jQuery方法 稍有不同,':nth-child' CSS选择器。它被传递给jQuery Engine,该引擎针对CSS引擎的性能进行了优化。

这两件事在功能上是不同的。

根据CSS3 :nth-child() Selector

  

:nth-​​child(n)选择器匹配第n个孩子的每个元素,无论其父类类型如何。

jQuery eq() Method

  

eq()方法返回一个元素,其中所选元素的特定索引号

例如,

<body>
    <div> div 1 </div>
    <div> div 2 </div>
    <div> div 3 </div>
    <div>
        div 4
        <div> div 5</div>
        <div> div 6</div>
    </div>
</body>

如果使用$('body div').eq(2),它将返回<div> div 2 </div>的jQuery对象,具体取决于索引2.
否则,如果您使用$('body div:nth-child(2)'),它将返回<div> div 2 </div> '和<div> div 6 </div>'的jQuery对象集。

因为'nth-child(n)'css选择器返回'的第n个子节点'

但我也不知道导致 eq()方法的根本原因是什么呢? 如果它没有用,我很抱歉。

答案 1 :(得分:0)

我无法在任何地方找到任何关于这个问题的答案,认为它可能是一个未知的bug。 所以我发了一封电子邮件给Chromium团队,这个问题已经在Chromium论坛正式开票。

您可以通过以下链接查看第n个孩子问题的门票:

https://code.google.com/p/chromium/issues/detail?id=364081&q=nth&colspec=ID%20Pri%20M%20Iteration%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified

感谢。