2010-06-16 67 views
3

標題是有點混亂的元素,但這裏是我所追求的:如何選擇一組是另一種元素的兒童

  • 我有一組包含所有在該h3元素的元素頁。
    用jQuery語言:var mySet = $('h3')

  • 我也有一個div元素var myContainer = $('div#foo')

  • 我需要找到一組mySet是的myContainer兒童的所有項目。

任何想法?我敢打賭,這裏有一些神奇的襯墊,但我想不出來。我寧願不是手動循環遍歷集合中的每個元素,並使用.closest(myContainer)或類似的東西來確定關係。

請注意,在我的場景中,我不能使用像$('div#foo h3')這樣的新選擇器(這太容易了),因爲我沒有訪問實際的選擇器值。所以它必須是動態的。

回答

1

有趣。假設你有兩個jQuery的收藏,你不知道選擇

var myContainer = $('div'); 
var mySet = $('h3:even'); 

filter似乎工作:

myContainer.children().filter(mySet) 

請記住,但是,這是undocumented遠正如我所見,所以它可能會改變。
.not也可以接受元素的集合,其作用類似。

工作示例:http://jsbin.com/owuru

+0

就像通過myContainer.children循環一樣,然後比較每個mySet(最差的情況)。 – unomi 2010-06-16 09:39:30

+0

@unomi - 這基本上是相交的兩組,所以是的,你必須經歷兩者。就複雜性而言,它可以在'nlogn'中完成,而這可能是'n²'。請注意,我並沒有假設有一位父母。 – Kobi 2010-06-16 09:47:57

+0

我的答案是我的意思是,最初的選擇器實際上是可用的,就像Andy E所證實的那樣 - 但是正如你後來所說的那樣,它們可能不一定是「純粹的」選擇器生成的列表,它使我的建議沒有意義。如果性能是一個問題,您應該確保smallset.filter(largeset)並可選地從大集合中刪除匹配。 – unomi 2010-06-16 09:56:56

0

我不知道jQuery,但在YUI3從選擇器查詢返回的節點列表包含用於創建列表的實際選擇器字符串,也許jQuery的暴露類似的功能?

+0

感謝downvote。明確要求不循環這些問題的問題。我不確定是否值得區分forEach和filter ... – unomi 2010-06-16 09:41:42

2

可以使用.filter方法,以減少元件的特定選擇匹配:

mySet.filter("div#foo > *"); 

您也可以通過訪問.selector財產jQuery對象使用的選擇。

+0

你不總是有一個選擇器,你可能有一個集合:'$('div>:hidden')。add('p ').filter(':odd')' - 我懷疑你會得到一個正確的選擇器,雖然我沒有檢查。 – Kobi 2010-06-16 09:29:26

+0

只需要注意,過濾器會精確地遍歷(在本例中)mySet的所有元素,儘管不是_manually_。 – unomi 2010-06-16 09:37:56

+0

@unomi:很少有jQuery選擇器和DOM遍歷方法沒有循環。不涉及循環的是那些可以使用'querySelectorAll()'獲得元素的元素,這在舊版瀏覽器中不受支持。關鍵是'.filter()'處理循環*和*條件檢查。 – 2010-06-16 10:51:59