2011-06-16 88 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