2011-06-16 56 views
4

让我们假设以下HTMLjQuery的发现孩子递归,但忽略某些元素

<div id=main> 
    <div id=a></div> 
    <div id=b></div> 
    <div id=c></div> 
    <div id=d> 
     <div id=d1 class="no"> 
     <div id=d11></div> 
     <div id=d12></div> 
     </div> 
    </div> 
    <div id=e> 
     <div id=e1 class="no"> 
     <div id=e11></div> 
     <div id=e12></div> 
     <div id=e13></div> 
     </div> 
    </div> 
</div> 

我想选择是主要的儿童的所有div标签,但要忽略有一类为“的div的儿童没有”。

我目前已经写了一个递归函数来完成这项工作。但想知道是否有一个jQuery选择器来获得我想要的。

我想与IDS的DIV A,B,C,d,D1,E,E1

感谢

编辑:这里创建一个测试页面 - http://jsfiddle.net/mRENV/

+0

那么,你的意思是** **儿童的主要主或** **祖先的div的div? – 2011-06-16 07:53:03

回答

3

在没有进一步的遍历你可以这样做一个选择: $('#main div:not(div.no > div)');

+0

谢谢。你的解决方案运行速度最快 - http://jsperf.com/finding-children-bug-ignoring-certain-children – Arun 2011-06-16 08:37:34

+3

@Arun:只是为了解释结果:第一个因为两个分数而更快:(a)你是使用子选择器'>'。没有它,差异就会减少([见这里](http:// jsperf。(b)在现代浏览器中,jQuery可以使用'querySelectorAll'并直接传递一个有效的CSS选择器。在较旧的浏览器中,您可能看不到任何区别 – 2011-06-16 08:42:15

10

它应该是:

$('#main div').not('.no div') 

Btw。术语的子女只是指直接后裔的一个元素。你想得到#main的所有后代(不仅是子女)。

参考:.not()

编辑:更新您的演示,使其正常工作:http://jsfiddle.net/fkling/mRENV/1/

+0

是菲利克斯,所有的后代,不只是直系孩子。请看这里http://jsfiddle.net/mRENV/ – Arun 2011-06-16 07:52:31

+0

@阿伦:看我的更新。您的演示无法正常工作,因为您正在更改元素的内容,这会移除他们的子项。 – 2011-06-16 07:56:00

+0

谢谢菲利克斯,它的工作原理。但是想知道是否我写了一个递归循环并忽略了.no类的元素比请求jQuery去搜索所有的孩子更有效率,然后删除那些不需要的元素? – Arun 2011-06-16 08:00:23

4

几个语法的方式来实现,使用jQuery的,我的建议是:

var $result = $('#main').find('div:not(.no > div)'); 

调用.find()help以及伪:not()help选择器。此行相当于:

var $result = $('#main').find('div').not('.no > div'); 

而后者可能会稍快。

+0

我犯了同样的错误。这会忽略所有'.no'元素,但实际上他想忽略所有'.no'元素的后代。 – 2011-06-16 07:49:55

+0

@Felix:ooopah。 – jAndy 2011-06-16 07:52:33