2010-05-29 48 views
0

我试图查询一个元素其子女查找以特定字符串开头的ID。这是查询元素及其子元素的最佳方式吗?

var foundIDs = containerElement.find('[id^=something]').andSelf().filter('id^=something'); 

find()方法只搜索的后代,所以我想我会尝试andSelf()。但是,andSelf()不带选择器。这意味着包含容器元素,无论它是否与find查询相匹配,然后我必须执行第二个filter()以删除容器元素,如果它完全不匹配的话。

我试图把andSelf()find()之前,但它似乎没有容器元素拿起入堆栈。

containerElement.andSelf().find('[id^=something]'); 

有没有更好的方法来实现我在做什么?

回答

1

只是把我的头顶部(未测试):

var foundIDs = containerElement 
        .filter('id^=something') 
        .add(containerElement.find('id^=something')); 

这是不是比你的第一次努力更有效,但我认为这是一个小清洁。

+0

我想有没有避免必须使用相同的选择器两次。 – Soviut 2010-05-29 19:23:07

1
containerElement.find('*').andSelf().filter('[id^=something]'); 
+0

应该可以工作,但是我想看看那个的性能 – 2010-05-29 19:01:28

+0

有道理,但是在find中使用选择器的版本将减少查询集,以便稍后处理过滤器的次数会减少。 – Soviut 2010-05-30 00:05:57

1

我知道你已经接受了一个答案,但我仍然会抛出这个问题。

var foundIDs = containerElement.wrap('<div>')    // Wrap 
           .parent()     // Traverse up 
           .find('[id^=something]'); // Perform find 

containerElement.unwrap(); // DOM is untouched 

因为你解缠containerElement前的功能齐全,DOM保持不变(如果你想知道)。

我使用livequery插件对其进行了验证,该插件从未检测到新的div

如果你登录foundIDs的ID(或其他),你会看到,顶层是你的containerElement(假设它匹配.find()标准

console.log(foundIDs.attr('id')); // Log the ID of the root element. 

编辑:

关于测试,我在两个版本上执行了1000次迭代循环,而对于只有2个嵌套元素的containerElement

我只在Mac上的Safari中测试过。

接受的答案快了大约7倍。

如果我添加了100个嵌套元素,则间隙缩小到2倍以内。

这是麻烦。如果containerElement不匹配,那么两个版本都返回0个元素。我不确定这是为什么。

+0

聪明,但它感觉相当hackish。我想知道堆栈上会出现什么样的性能冲击? – Soviut 2010-05-30 00:04:56

+0

@Soviut - 好问题。我做了一些测试。我会用我非正式的,半不科学的结果来更新我的答案。需要注意的一点是,如果'containerElement'与'.find()'中的选择符不匹配,那么接受的答案似乎完全失败。 – user113716 2010-05-30 00:44:46

+0

@Soviut - 无视我对选择器失败的评论。我正在犯一个笨蛋错误。尽管我发现比两个答案都快的方法。我会将其发布在我的答案的顶部。 – user113716 2010-05-30 01:00:00

1

这一个比我的其他答案有更好的表现,但你失去了你接受的答案提供的链接能力。

// Do a typical find. 
var found = containerElement.find('[class^=something]'); 

    // Test the containerElement directly, 
    // and push it into the 'found' object if it matches. 
if(containerElement.is('[class^=something]')) found.push(containerElement); 
+0

由于我如何处理我收到的'each()'containerElement,我试图在单个查询中完成所有操作。 – Soviut 2010-05-30 19:39:41

+0

@Soviut - 是的,我认为你选择的答案是一个很好的答案。 – user113716 2010-05-30 19:42:47

相关问题