2012-11-19 152 views
6

我已經重寫了這個問題並刪除了這個例子,因爲它似乎混淆了你。對不起,麻煩了。匹配第一匹配的分層後裔與jQuery選擇器

我需要匹配選擇匹配其第一後裔。

如果多個元素此選擇匹配,但在分離樹(即,如果一個不是另一個的父母),那麼我要選擇他們兩個。

確切的DOM結構是未知的,所以我不能使用像.children()>選擇器這樣的函數(因爲他們希望用戶確定實際的DOM結構)。

我真正需要的是什麼樣子的.closest()功能,但在一次匹配,而不是孩子父母,並有可能多個孩子。

+1

如果你能保證唯一的ID

加載插件或將其添加到您的源代碼,你可以簡單的把它用這種方式後, ,肯定'$('#B')。find('#C')'會起作用嗎? – BoltClock

+0

@BoltClock。但hr寫道他不能,我認爲你是jQuery和css master,爲什麼你需要'find'作爲'id'選擇器?! – gdoron

+0

@gdoron:我只是把它放在他的'.find('...')'例子中。他也沒有說'#B'和'#C' *不存在於真實的代碼中,所以我假設它們確實存在,並且向他扔東西。理想情況是,你可以只使用'$('#C')'......但我想我並不真正理解OP的實際代碼中發生了什麼。 – BoltClock

回答

1

每棵樹從#B.children()定義開始;這樣的樹中的每一個第一.foo.find('.foo:eq(0)'),所以你應該能夠使用:

$('#B').children(':not(.foo)').andSelf().find('.foo:eq(0)'); 
+0

在我自己的代碼中有一個'.foo',但我想知道是否有一種方法來匹配每個'.foo'第一個孩子,就像[this]一樣(http://jsfiddle.net/7gfFP/2 /)示例(應該突出顯示CCC和GGG)。 –

+0

新的解決方案('$(「#B」)兒童()找到(「富:EQ(0)」);')在工作(另一個沒有,因爲孩子選擇防止多個疊瓦級) 。但是,我不確定要理解爲什麼'.find('。foo:eq(0)')'不會返回與.find('。foo')。eq(0)'相同的內容。 –

+0

好吧,我明白了,實際上它不起作用(但幾乎就是這樣!)。它不能匹配第一個孩子的'.foo's(在[本例中](http://jsfiddle.net/7gfFP/4/),BBB也應該突出顯示)。 –

0

你可以使用jQuery插件closestDescendant

這implemenst廣度優先搜索,所以其檢查的所有兒童當前的元素會降低到下一個級別。

jQuery('#parent').closestDescendant(".selector", true) 

在這裏,你可以找到該功能的演示:demo closestDescendant