寻找包含当前节点的jQuery find(..)方法

时间:2010-05-13 15:29:31

标签: jquery

jQuery find(..)遍历方法不包含当前节点 - 它以当前节点的子节点开头。在匹配算法中调用包含当前节点的查找操作的最佳方法是什么?通过文档查看没有任何内容立即跳出来。

12 个答案:

答案 0 :(得分:140)

对于jQuery 1.8及更高版本,您可以使用.addBack()。它需要一个选择器,因此您不需要过滤结果:

object.find('selector').addBack('selector')

在jQuery 1.8之前,您遇到了.andSelf(),(现已弃用并已删除),然后需要进行过滤:

object.find('selector').andSelf().filter('selector')

答案 1 :(得分:41)

你不能直接这样做,我能想到的最接近的是使用.andSelf()并调用.filter(),如下所示:

$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);

不幸的是.andSelf()没有使用选择器,这会很方便。

答案 2 :(得分:8)

定义

$.fn.findSelf = function(selector) {
    var result = this.find(selector);
    return (this.is(selector)) ?
        result.add(this) : result;
};

然后使用

$.findSelf(selector);

而不是

$find(selector);

可悲的是,jQuery没有这个内置功能。这么多年的发展真的很奇怪。由于.find()的工作原理,我的AJAX处理程序并未应用于某些顶级元素。

答案 3 :(得分:4)

$('selector').find('otherSelector').add($('selector').filter('otherSelector'))

您可以将$('selector')存储在变量中以进行加速。如果您需要它,您甚至可以为此编写自定义函数:

$.fn.andFind = function(expr) {
  return this.find(expr).add(this.filter(expr));
};

$('selector').andFind('otherSelector')

答案 4 :(得分:4)

接受的答案非常低效,并过滤了已经匹配的元素集。

//find descendants that match the selector
var $selection = $context.find(selector);
//filter the parent/context based on the selector and add it
$selection = $selection.add($context.filter(selector);

答案 5 :(得分:2)

我知道这是一个老问题,但有更正确的方法。如果顺序很重要,例如当你匹配像:first这样的选择器时,我写了一个小函数,它将返回完全相同的结果,就像find()实际包含当前元素集一样: / p>

$.fn.findAll = function(selector) {
  var $result = $();

  for(var i = 0; i < this.length; i++) {
    $result = $result.add(this.eq(i).filter(selector));
    $result = $result.add(this.eq(i).find(selector));
  }

  return $result.filter(selector);
};

无论如何都不会有效率,但这是我提出的维持正确秩序的最佳方式。

答案 6 :(得分:2)

如果您希望链接正常工作,请使用下面的代码段。

$.fn.findBack = function(expr) {
    var r = this.find(expr);
    if (this.is(expr)) r = r.add(this);
    return this.pushStack(r);
};

调用end函数后,它返回#foo元素。

$('#foo')
    .findBack('.red')
        .css('color', 'red')
    .end()
    .removeAttr('id');

如果没有定义额外的插件,你就会陷入困境。

$('#foo')
    .find('.red')
        .addBack('.red')
            .css('color', 'red')
        .end()
    .end()
    .removeAttr('id');

答案 7 :(得分:1)

我认为andSelf就是你想要的:

obj.find(selector).andSelf()

请注意,这将始终添加回当前节点,无论它是否与选择器匹配。

答案 8 :(得分:1)

如果您正在严格查看当前节点,则只需执行

即可
$(html).filter('selector')

答案 9 :(得分:0)

如果您正在寻找正好一个元素,无论是当前元素还是其中的元素,您都可以使用:

result = elem.is(selector) ? elem : elem.find(selector);

如果您正在寻找多个元素,您可以使用:

result = elem.filter(selector).add(elem.find(selector));

使用andSelf / andBack非常罕见,不确定原因。也许是因为一些人在我之前提到的性能问题。

(我现在注意到 Tgr 已经提供了第二个解决方案)

答案 10 :(得分:0)

我正试图找到一个不会重复自身的解决方案(即不要两次输入相同的选择器)。

这个很小的jQuery扩展做到了:

jQuery.fn.findWithSelf = function(...args) {
  return this.pushStack(this.find(...args).add(this.filter(...args)));
};

它将find()(仅后代)与filter()(仅当前集)组合在一起,并支持所有都吃的参数。 pushStack()允许.end()正常工作。

像这样使用:

$(element).findWithSelf('.target')

答案 11 :(得分:-2)

这是正确的(但悲伤的)真相:

$(selector).parent().find(oSelector).filter($(selector).find('*'))

http://jsfiddle.net/SergeJcqmn/MeQb8/2/