根据第n,mth,oth,...,模式选择孩子?

时间:2014-11-21 21:29:08

标签: javascript jquery

给定一个包含许多div子节点的div,以及一个运行时派生数ChildrenPerRow,如何选择每个“虚拟”行中不是该虚拟行中最后一个元素的所有子节点?

例如,如果ChildrenPerRow = 5,则选择器应返回第1,第2,第3,第4,第6,第7,第8,第9,第11,第12,第13,第14等。如果ChildrenPerRow = 4 ,选择器应返回第1,第2,第3,第5,第6,第7,第9,第10,第11,第13,第14,第15等。

我尝试过使用类似的东西:

var FilterStr = '';
for(var i=1; i<ChildrenPerRow;i++){
   FilterStr+=':nth-child('+i+'n),';
}
FilterStr = FilterStr.replace(/(^,)|(,$)/g, "");
$Children.filter(FilterStr).doSomething();

产生一个选择器,如:

:nth-child(1n),:nth-child(2n),:nth-child(3n),:nth-child(4n)

但这会选择每个孩子。我也觉得使用一个看起来构建一个选择器字符串是低效的。我认为这可以使用非选择器来完成,但我也想知道如何使用正选择器来完成它。

所以问题是,实现这一目标的有效方法是什么?

3 个答案:

答案 0 :(得分:3)

如果我理解正确

 $("div div").not(":last-child");

应该足够了,

为10个孩子的divs

<div>
    <div>1</div>
    <div>1</div>
    <div>1</div>
    <div>1</div>
    <div>1</div>
</div>
<div>
    <div>1</div>
    <div>1</div>
    <div>1</div>
    <div>1</div>
    <div>1</div>
</div>

它将返回8,省略每个父div的最后一个孩子

DEMO小提琴 http://jsfiddle.net/1yg3z86p/1/

答案 1 :(得分:3)

这是你在找什么?

$Children.filter(':not(:nth-child(' + ChildrenPerRow + 'n))');

如果没有:not()选择器,您必须构建一个这样的选择器:

$Children.filter(':nth-child(5n+1), :nth-child(5n+2), :nth-child(5n+3), :nth-child(5n+4)')

答案 2 :(得分:1)

可以使用index的{​​{1}}参数来提高可读性

filter(fn)