我想写我的答案只是为了讨论之前的两个答案:来自 gdoron 的 the answer 和来自 neu-rah 的 the answer。如果我们在投票计数上看到,大多数读者会发现 doron 的答案更好。我不同意,我试图解释原因。
你会在:gt()Selector 的文档中找到解释(参见“附加说明:”here):
因为:gt() 是一个 jQuery 扩展而不是 CSS 的一部分
规范,使用 :gt() 的查询不能利用
原生 DOM 提供的性能提升 querySelectorAll()
方法。为了在现代浏览器中获得更好的性能,请使用
$("your-pure-css-selector").slice(index) 代替。
您可以使用here 或更好的here 测试代码(使用非最小化的jQuery 1.7.2 代码)。该代码仅使用语句$("ul li:gt(6)").css("color", "red");。如果您在 Chrome 的开发者工具中使用激活的“异常暂停”按钮开始演示,您会更好地理解问题。您将看到以下异常(它不会是第一个):
所以你可以看到当前的jQuery实现尝试使用nativequerySelectorAll()的web浏览器来获得最佳性能。之后,函数$.makeArray 将用于从NodeList 制作jQuery 包装器。万一出现异常the line
return oldSizzle(query, context, extra, seed);
因此,如果您使用querySelectorAll() 支持的选择器,您将获得最佳性能。例如
$("ul li").slice(7)
不如
$("ul li:gt(6)")
我会建议您尽可能使用更精确的选择器。例如,如果父 <ul> 元素有 id="menu1" 那么你可以使用
$("#menu1 >li").slice(7)
为了最好的结果。如果您的页面上有 多个 <ul> 元素,它会另外提供帮助。
有人可以提一下:选择器"ul li:gt(6)" 工作得足够快。这是正确的,但您不应该忘记,您有时会在循环内部使用选择器,或者在将在循环内部调用的函数内部使用它。所以如果执行时间乘以 100,那么 10ms 和 30ms 之间的差异会更加明显。
此外,如果有人问自己如何实现某些选择并获得答案,他/她将永久使用代码模式。我认为使用具有性能优势的模式会更好。不是吗。
更新:为了消除$("ul li:gt(6)")、$("ul li").slice(7) 和$("#menu1 >li").slice(7) 选择器在性能上的差异,我另外制作了the demo。每个人都可以测试他使用的网络浏览器的差异。您还应该不要忘记,如果页面有 许多其他 元素,则 id 选择器会更好地工作。
在我的计算机上,$("ul li").slice(7) 和 $("#menu1 >li").slice(7) 的执行时间大致相同(页面元素非常少),并且比 $("ul li:gt(6)") 的执行时间要快 2.5-4.5 倍 .结果可能取决于li 项目的数量、页面上的元素数量和许多其他因素,但我希望测试清楚地表明slice 的使用与@ 的使用相比具有性能优势987654356@(就像我们可以在之前引用的 jqGrid 文档中阅读一样)。