Javascript 这是查询元素及其子元素的最佳方法吗?
我试图查询一个元素及其子元素,以查找以特定字符串开头的IDJavascript 这是查询元素及其子元素的最佳方法吗?,javascript,jquery,filter,jquery-selectors,Javascript,Jquery,Filter,Jquery Selectors,我试图查询一个元素及其子元素,以查找以特定字符串开头的ID var foundIDs = containerElement.find('[id^=something]').andSelf().filter('id^=something'); find()方法只搜索子体,所以我想我应该试试和self()。但是,和self()不接受选择器。这意味着无论容器元素是否与find查询匹配,都将包含该容器元素,然后我必须对其执行辅助过滤器(),如果容器元素始终不匹配,则将其删除 我试图在find()之前放
var foundIDs = containerElement.find('[id^=something]').andSelf().filter('id^=something');
find()
方法只搜索子体,所以我想我应该试试和self()
。但是,和self()
不接受选择器。这意味着无论容器元素是否与find查询匹配,都将包含该容器元素,然后我必须对其执行辅助过滤器()
,如果容器元素始终不匹配,则将其删除
我试图在find()
之前放置和self()
,但它似乎没有将容器元素放入堆栈中
containerElement.andSelf().find('[id^=something]');
有没有更好的方法来实现我正在做的事情?就在我脑海中(未经测试):
这并没有比你第一次尝试的效率高多少,但我认为它更干净了一点。刚刚从我的脑海中浮现出来(未经测试):
containerElement.find('*').andSelf().filter('[id^=something]');
这并没有比你第一次努力的效率高多少,但我认为它更干净了一点。我知道你已经接受了一个答案,但我还是要把这个答案扔出去
containerElement.find('*').andSelf().filter('[id^=something]');
var foundIDs = containerElement.wrap('<div>') // Wrap
.parent() // Traverse up
.find('[id^=something]'); // Perform find
containerElement.unwrap(); // DOM is untouched
编辑: 关于测试,我在两个版本上对一个只有2个嵌套元素的
containerElement
执行了1000次迭代循环
我只在Mac上进行了Safari测试
被接受的答案大约快了7倍
如果我添加了100个嵌套元素,那么间距将缩短到原来的2倍
麻烦来了。如果
containerElement
不匹配,两个版本都返回0个元素。我不知道这是为什么。我知道你已经接受了一个答案,但我还是要把这个答案扔出去
var foundIDs = containerElement.wrap('<div>') // Wrap
.parent() // Traverse up
.find('[id^=something]'); // Perform find
containerElement.unwrap(); // DOM is untouched
编辑: 关于测试,我在两个版本上对一个只有2个嵌套元素的
containerElement
执行了1000次迭代循环
我只在Mac上进行了Safari测试
被接受的答案大约快了7倍
如果我添加了100个嵌套元素,那么间距将缩短到原来的2倍
麻烦来了。如果
containerElement
不匹配,两个版本都返回0个元素。我不知道这是为什么。这个答案比我的另一个答案性能更好,但是你失去了你接受的答案所提供的链接能力
// 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);
这一个比我的另一个答案有更好的性能,但是你失去了你接受的答案所提供的链接能力
// 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);
我想没有办法避免必须使用同一个选择器两次。我想没有办法避免必须使用同一个选择器两次。很聪明,但感觉相当粗糙。我想知道什么样的性能冲击会在堆栈上产生?@Soviut-好问题。我做了一些测试。我会用我非正式的、半不科学的结果更新我的答案。需要注意的一点是,如果
containerElement
与.find()
@Soviut中的选择器不匹配,则接受的答案似乎完全失败-忽略我对选择器失败的评论。我犯了个愚蠢的错误。虽然我找到了一个比这两个答案都快的方法。我会把它贴在我答案的顶部。你应该把它作为第二个答案贴出来,以减少混乱。这样,两个人都可以被提升投票权。@Soviut-谢谢。做了一点整理。:)很聪明,但感觉相当粗糙。我想知道什么样的性能冲击会在堆栈上产生?@Soviut-好问题。我做了一些测试。我会用我非正式的、半不科学的结果更新我的答案。需要注意的一点是,如果containerElement
与.find()
@Soviut中的选择器不匹配,则接受的答案似乎完全失败-忽略我对选择器失败的评论。我犯了个愚蠢的错误。虽然我找到了一个比这两个答案都快的方法。我会把它贴在我答案的顶部。你应该把它作为第二个答案贴出来,以减少混乱。这样,两个人都可以被提升投票权。@Soviut-谢谢。做了一点整理。:)有道理,但是我的版本在find中带有选择器将减少查询集,以便过滤器在以后处理的次数更少。有道理,但是我的版本在find中带有选择器将减少查询集,以便过滤器在以后处理的次数更少。由于我处理'each()'我收到的containerElement。由于我处理收到的'each()'containerElement的方式,我试图在一个查询中完成这一切。