【问题标题】:Chained selectors in jQuery: apply selector in already filtered resultsjQuery 中的链式选择器:在已过滤的结果中应用选择器
【发布时间】:2013-05-26 01:54:41
【问题描述】:

忽略:http://jsfiddle.net/gulcoza/9cVFT/1/

更新的 FIDDLE: http://jsfiddle.net/gulcoza/9cVFT/4/

整个代码在上面的小提琴中,但我也会在这里解释:

HTML

<ul>
    <li id="e1">1</li>
    <li id="e2" class="hidden">2</li>
    <li id="e3">3</li>
    <li id="e4" class="hidden">4</li>
    <li id="e5">5</li>
    <li id="e6">6</li>
    <li id="e7">7</li>
    <li id="e8">8</li>
    <li id="e9">9</li>
    <li id="e10">10</li>
</ul>

jQuery

console.log(
    $('ul li:visible:nth-child(4n)')
);

我的预期结果: li#e6, li#e10 - 为什么?因为我只想要可见元素中的 4n 个元素。

但是

实际结果:只有在所有可见的情况下,我才会从所有元素中获取 4n 元素。

console.log(
    $('ul li:visible').filter(function(index) {
        if ((index + 1) % 4 ==0) return true;
    })
);

我对任何比以下更好的解决方案感兴趣:

console.log(
    $('ul li:visible').filter(function(index) {
        if ((index + 1) % 4 ==0) return true;
    })
);

更新的小提琴:

http://jsfiddle.net/gulcoza/9cVFT/4/

为什么 4 号不起作用。在调用过滤器的那一刻,结果应该已经被过滤了,恕我直言。 :|

// 4 - could be a nice solution
console.log(
    $('ul li:visible').filter(':nth-child(4n)')
);

为什么这不起作用?在$('ul li:visible') 时刻,只有可见的应该可用。

【问题讨论】:

  • :nth-child 是相对于父元素,而不是选择。您使用 filter 是合适的解决方案,尽管您可能希望将该函数放在代码中的其他位置,以便在您要多次调用它时可以重用它。
  • 我不能用逗号或其他任何东西对它们进行分组......在网上找不到任何有用的东西
  • 您的解决方案有什么问题?我认为这是最好的解决方案。就像@zzzzBov 说的那样,你应该把函数放在某个地方可以重用。
  • @BillyMathews - 我就是无法平静下来。最重要的是为什么不是这样。 4 不工作?检查更新的小提琴
  • @alex.dominte no.4 不起作用,因为:nth-child 仍然指的是元素相对于其父元素的索引。请记住 - :nth-child 是 CSS,而不是 jQuery。

标签: javascript jquery html jquery-selectors


【解决方案1】:

这是因为nth-child 匹配元素是基于它们在父元素的子元素列表中的位置而不是基于 jQuery 集合(选定的元素),在此你必须使用 @ 987654326@ 方法,filter 方法也比链式字符串选择器更快。

这就是选择器过滤元素的方式:

$('ul li:nth-child(4n):visible') 
//       ^            ^---- [li#e8]
//       |  
//       | --- [li#e4.hidden, li#e8]

$('ul li:visible:nth-child(4n)') 
//       ^            ^---- [li#e8]
//       |  
//       | --- [li#e1, li#e3, li#e5, li#e6, li#e7, li#e8, li#e9, li#e10]
//             [1,     3,     5,     6,     7,     8,     9,     10]

【讨论】:

  • 我明白这一点,但我不明白为什么这不起作用console.log( $('ul li:visible').filter(':nth-child(4n)') );检查更新的问题
  • @alex.dominte 因为只有 :nth-child(4n) 的 ul 是第 4 个或第 8 个 li - 第 4 个是隐藏的,所以你得到的只是第 8 个 li
  • 任何关于 jquery-css 选择器之间差异的文档/参考将不胜感激
  • @alex.dominte 欢迎您,nth-child w3, MDN, Documentation
  • "nth-child 不是跨浏览器"怎么回事? jQuery makes it work in every browser。作为 CSS 选择器,它可能不起作用,但在 jQuery 中它总是可以的。
【解决方案2】:

正如您现在所知道的 - 最好的方式就是您自己的方式。

这没有按预期工作的原因是:nth-child 伪选择器根据元素在父元素中的位置来选择元素。

还要注意,选择器字符串是 CSS 选择器的字符串,与 JavaScript 无关。

我在另一个关于 JS/CSS here 的问题上找到了一个很好的答案

我建议你像这样创建自己的方法:

$.fn.nthChildren = function(n){
    this.filter(function(index) {
        if ((index + 1) % n ==0) return true;
    })
}
console.log(
    $('ul li:visible').nthChildren(4);
);

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2011-01-06
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2021-04-09
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多