Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这是查询元素及其子元素的最佳方法吗?_Javascript_Jquery_Filter_Jquery Selectors - Fatal编程技术网

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

Javascript 这是查询元素及其子元素的最佳方法吗?,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()之前放

我试图查询一个元素及其子元素,以查找以特定字符串开头的ID

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的方式,我试图在一个查询中完成这一切。