给定一个包含许多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)
但这会选择每个孩子。我也觉得使用一个看起来构建一个选择器字符串是低效的。我认为这可以使用非选择器来完成,但我也想知道如何使用正选择器来完成它。
所以问题是,实现这一目标的有效方法是什么?
答案 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)