2014-11-21 42 views
1

给定一个包含许多div子元素的div,并且运行时派生号码为ChildrenPerRow,如何在每个“虚拟”行中选择不是该虚拟行上最后一个元素的所有子项?根据nth,mth,oth,...,pattern来选择孩子吗?

例如,如果ChildrenPerRow = 5,选择应该返回1,第2,第3,第4,第6,第7,第8,第9,第11,第12,第13,第14等,如果ChildrenPerRow = 4,选择应该返回1号

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

,类似的会产生一个选择:,第2,第3,第5,第6,第7,第9,第10,第11,第13,第14,第15等

我已经使用类似尝试

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

B这选择每个孩子。我也觉得使用一下来构建选择器字符串效率不高。我认为这可以使用不选择器来完成,但我想知道如何使用正选择器来完成。

所以问题是,什么是有效的方式来实现这一点?

回答

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)') 
+0

我想是这样,让我检查我什么时候回来。 – Nick 2014-11-21 22:04:26

3

如果我理解正确

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

应该够了,

为10孩子的div

<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,ommiting每一位父母div的最后一个子

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

+0

该行不包裹在div的,他们是“虚拟”行,因此它与许多一个div容器直接的儿童divs。每行的项目根据父容器的宽度而变化。 – Nick 2014-11-21 22:01:51

+0

好的,在这种情况下,投票给戴夫,charlietfl也会工作,尽管它应该是!== ChildrenPerRow - 1排除最后一个元素 – 2014-11-21 22:13:14

1

可以使用filter(fn)index参数,使更多的东西可读

$('.parentClass .childClass').filter(function(index){ 
    return index % (ChildrenPerRow-1) !==0; 
}).doSomething();