我正在尝试查询其子元素和,以查找以特定字符串开头的ID。
var foundIDs = containerElement.find('[id^=something]').andSelf().filter('id^=something');
find()
方法只搜索后代,所以我想我会尝试andSelf()
。但是,andSelf()
没有选择器。这意味着包含容器元素,无论它是否与查询查询匹配,然后我必须在其上执行辅助filter()
以删除容器元素(如果它根本不匹配)。
我尝试将andSelf()
放在 find()
之前,但它似乎没有将容器元素放入堆栈。
containerElement.andSelf().find('[id^=something]');
有没有更好的方法来实现我正在做的事情?
答案 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);