3

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

更新的小提琴: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 个元素。

实际结果:只有当它们可见时,我才能从 all 中获取 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')只有可见的应该可用。

4

2 回答 2

2

那是因为nth-child匹配元素是基于它们在父元素的子元素列表中的位置而不是基于 jQuery 集合(选择的元素),在这个你必须使用filter方法,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]
于 2013-05-30T13:14:14.753 回答
1

正如您现在所知道的 - 做到这一点的最佳方式就是您自己的方式。

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

另请注意,选择器字符串是CSS选择器字符串,与 JavaScript 无关。

我在这里找到了关于 JS/CSS 的另一个问题的好答案

我建议您创建自己的方法,如下所示:

$.fn.nthChildren = function(n){
    this.filter(function(index) {
        if ((index + 1) % n ==0) return true;
    })
}
console.log(
    $('ul li:visible').nthChildren(4);
);
于 2013-05-30T13:47:14.263 回答