代码之家  ›  专栏  ›  技术社区  ›  John K

正在查找包含当前节点的jquery find(..)方法

  •  115
  • John K  · 技术社区  · 14 年前

    jQuery find(..) 遍历方法不包括当前节点-它从当前节点的子节点开始。在匹配算法中调用包含当前节点的查找操作的最佳方法是什么?看了看医生,没有什么东西立刻跳出来。

    11 回复  |  直到 6 年前
        1
  •  140
  •   Robert    8 年前

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

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

    在jquery 1.8之前,您一直被 .andSelf() ,(现在已弃用并删除)然后需要筛选:

    object.find('selector').andSelf().filter('selector')
    
        2
  •  41
  •   Nick Craver    14 年前

    你不能直接这么做,我能想到的最接近的就是使用 .andSelf() 呼唤 .filter() ,像这样:

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

    不幸地 and Self() 不需要选择器,这很方便。

        3
  •  6
  •   Dmitriy Sintsov    9 年前

    定义

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

    然后使用

    $.findSelf(selector);
    

    而不是

    $find(selector);
    

    遗憾的是,jquery没有这个内置的。这么多年的发展真的很奇怪。由于.find()的工作方式,我的Ajax处理程序没有应用于某些顶级元素。

        4
  •  4
  •   Tgr    14 年前
    $('selector').find('otherSelector').add($('selector').filter('otherSelector'))
    

    你可以储存 $('selector') 在一个变量中加速。如果您非常需要,甚至可以为此编写自定义函数:

    $.fn.andFind = function(expr) {
      return this.find(expr).add(this.filter(expr));
    };
    
    $('selector').andFind('otherSelector')
    
        5
  •  4
  •   erikrestificar    10 年前

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

    //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);
    
        6
  •  2
  •   Justin Warkentin    11 年前

    我知道这是个老问题,但有一个更正确的方法。如果顺序很重要,例如当您匹配类似 :first ,我写了一个小函数,它将返回与 find() 实际上包括了当前的元素集:

    $.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);
    };
    

    不管怎样,它都不会有效率,但这是我所能想到的维持正常秩序的最好办法。

        7
  •  2
  •   SeregPie    7 年前

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

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

    调用结束函数后,返回foo元素。

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

    如果不定义额外的插件,您将无法理解这一点。

    $('#foo')
        .find('.red')
            .addBack('.red')
                .css('color', 'red')
            .end()
        .end()
        .removeAttr('id');
    
        8
  •  1
  •   interjay    14 年前

    我想 andSelf 就是你想要的:

    obj.find(selector).andSelf()
    

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

        9
  •  1
  •   mikewasmike    7 年前

    如果严格查看当前节点,则只需执行以下操作

    $(html).filter('selector')
    
        10
  •  0
  •   oriadam    6 年前

    以防你在找 正好一个元素 ,无论是当前元素还是其中一个元素,都可以使用:

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

    以防你在找 多元素 你可以使用:

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

    使用 andSelf / andBack 很罕见,不知道为什么。也许是因为我之前提到的一些人的表现问题。

    (我现在注意到 TGR 已经给出了第二个解决方案)

        11
  •  -2
  •   Serge    11 年前

    这是正确的(但可悲的)事实:

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

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