这两个jQuery行可以产生不同的结果吗?

时间:2014-03-04 04:30:36

标签: javascript jquery

我正在清理我的旧jQuery插件,我找到了这段代码:

var foo = $some.find(theCriteria).andSelf().filter(theCriteria);

这看起来很愚蠢,就像它相当于:

var foo = $some.andSelf().find(theCriteria);

我认为我写第一个版本有一些原因,但我想不出它会是什么。后一个代码功能是否相同?或者我错过了一些微妙的互动?

在上面:

  • $some是一个jQuery对象,由一个或多个元素组成,通常包含子元素。
  • theCriteria是一个复合CSS选择器字符串,例如".bar, .jim, .jam"
  • andSelf()是因为$some可能选择了一个应用了其中一个CSS类的根元素,如果是,我想选择它。

2 个答案:

答案 0 :(得分:5)

是的,有区别:

<div id="test" class="bar">
  <div class="bar" />
</div>

使用以下表达式:

// gives both <div>
$('#test')
   .find('.bar')
   .andSelf()
   .filter('.bar');

// only returns the inner <div>
$('#test')
   .andSelf()
   .find('.bar')

这是因为filter()对结果集中的所有项进行操作,而find()在结果集内的每个节点上执行DOM搜索,有效地跳过它们。

除了.addBack(selector),您可以这样做:

$('#test')
   .find('.bar')
   .add($('#test').filter('.bar'))

答案 1 :(得分:3)

不,不等同

如果你只想支持jQuery 1.8+,那么你可以使用.addBack() - Demo

var foo = $some.find(theCriteria).addBack(theCriteria);

否则你可以使用.add

var foo = $some.find(theCriteria).add($some.filter(theCriteria));

由于演示有两个原因:Fiddle

,因此不一样
  • andSelf()在你的情况下添加了前一组元素,没有先前的元素集 - 这会将文档对象添加到元素集中,从而导致不良结果
  • 因为你使用的是.find(),所以你没有过滤$ some对象集