这是查询元素及其子元素的最佳方法吗?

时间:2010-05-29 18:38:20

标签: javascript jquery filter jquery-selectors

我正在尝试查询其子元素,以查找以特定字符串开头的ID。

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

find()方法只搜索后代,所以我想我会尝试andSelf()。但是,andSelf()没有选择器。这意味着包含容器元素,无论它是否与查询查询匹配,然后我必须在其上执行辅助filter()以删除容器元素(如果它根本不匹配)。

我尝试将andSelf() 放在 find()之前,但它似乎没有将容器元素放入堆栈。

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

有没有更好的方法来实现我正在做的事情?

4 个答案:

答案 0 :(得分:1)

就在我头顶(未经测试):

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我知道你已经接受了答案,但无论如何我都会把它扔出去。

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

containerElement.unwrap();  // DOM is untouched

因为您在函数完成之前展开containerElement,所以DOM保持不变(如果您想知道)。

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

如果您记录了foundID的ID(或其他),您会看到顶级是您的containerElement(假设它符合.find()条件。

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

修改

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

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

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

如果我添加了100个嵌套元素,则差距缩小到不到2倍。

这是麻烦。如果containerElement不匹配,则两个版本都返回0个元素。我不知道为什么会这样。

答案 3 :(得分: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);