【问题标题】:jquery select all children after nth-childjquery选择第n个孩子之后的所有孩子
【发布时间】:2012-06-13 14:23:44
【问题描述】:

我正在使用 jquery 并创建显示隐藏列表,我需要隐藏 ul 中第 6 个孩子之后的所有子列表项。通常我会通过设置高度然后在单击时更改高度来做到这一点,但要实现这一点,我需要将 overflow:hidden 添加到我的 css 中,这不是一个选项。

如何获取大于第 7 个孩子的所有子列表元素?

类似的,

$("ul li:6n").domeSomething()

【问题讨论】:

    标签: javascript jquery jquery-selectors


    【解决方案1】:

    如何获取大于第 7 个孩子的所有子列表元素?

    选择元素索引=7+

    $("ul li:gt(6)").domeSomething()
    

    :gt selector

    选择器使用零基索引

    请注意,由于 JavaScript 数组使用从 0 开始的索引,这些选择器反映了这一事实。这就是为什么 $('.myclass:gt(1)') 选择文档中类 myclass 的第二个元素之后的元素,而不是选择第一个之后的元素。相反,:nth-child(n) 使用从 1 开始的索引以符合 CSS 规范。

    【讨论】:

    • 其实你之前的:gt(6)是对的……它从第7个0-index开始,和从第8个孩子开始(大于第7个孩子)是一样的。
    • @BoltClock。是的,不知道为什么我改变了它,他的例子中的 6 让我很困惑。
    • 别担心,总会发生的:)
    • @BoltClock。是的,我讨厌那些索引……一个错误是最常见的错误。
    【解决方案2】:

    我想写我的答案只是为了讨论之前的两个答案:来自 gdoronthe answer 和来自 neu-rahthe 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 文档中阅读一样)。

    【讨论】:

    • 选择器"ul li:gt(6)" 工作得足够快。我非常抱歉,我不得不这样做。 +1
    • @gdoron:“ul li:gt(6)”选择器的绝对执行时间很短。我同意,但是$("ul li").slice(7)(或者如果可能的话$("#menu1 >li").slice(7))的执行会更好,因为querySelectorAll本机 Web 浏览器代码可以作为JavaScript 代码快速运行。我在回答的最后写了关于使用选择器在循环中的情况。在这种情况下,差异会更加明显。旧版本的 jQuery 不使用代码 querySelectorAll。因此,目前有非常 旧的最佳实践示例使用:eq:first:gt 等。这是个问题。
    • @gdoron:我制作了the demo,它更清楚地显示了性能差异(请参阅我的答案的更新部分)。
    【解决方案3】:

    使用切片减少集合

    .slice(start[,end])
    

    http://api.jquery.com/slice/

    示例(已编辑)

    $("ul li").slice(6).doSomething(...)
    

    【讨论】:

    • startend 应该是什么?
    • 这很明显,但值是什么?
    • 基于0的索引,可以省略end,可以使用负数从末尾选择,见链接
    • 如果你使用.slice,它必须是.slice(7)。无论如何,这样你选择所有li 只是为了稍后删除它们......
    • +1 来自我。我必须写我自己的答案来解释为什么你建议的方式更好。
    【解决方案4】:

    试试这个:

    $('ul li:eq(6)').nextAll().domeSomething()
    

    【讨论】:

    • 不是我会使用的方式,但如果你真的想使用它,使用它:$('ul li:eq(7)').nextAll('li').domeSomething()
    • @gdoron 如果是有效标记,则无需指定'li'。
    • +1,是的,没想到,要依赖就买,为什么选择器里的li...;-)
    • @gdoron 我试图通过对 OP 的代码进行最小的更改来回答 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2012-07-22
    • 2023-03-16
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多