2010-06-16 65 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