Ищем метод jQuery find (..), который включает текущий узел - PullRequest
116 голосов
/ 13 мая 2010

Метод обхода jQuery find (..) не включает текущий узел - он начинается с дочерних элементов текущего узла. Каков наилучший способ вызвать операцию поиска, которая включает текущий узел в свой алгоритм сопоставления? Просматривая документы, сразу ничего не выскакивает на меня.

Ответы [ 11 ]

140 голосов
/ 09 июля 2013

Для jQuery 1.8 и выше вы можете использовать .addBack(). Требуется селектор, поэтому вам не нужно фильтровать результат:

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

До выпуска jQuery 1.8 вы застряли с .andSelf() (теперь устарело и удалено), которое затем требовало фильтрации:

object.find('selector').andSelf().filter('selector')
41 голосов
/ 13 мая 2010

Вы не можете сделать это напрямую, самое близкое, что я могу придумать, это использовать .andSelf() и вызвать .filter(), например:

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

К сожалению .andSelf() не использует селектор, что было бы удобно.

9 голосов
/ 23 июля 2015

Определение

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

затем используйте

$.findSelf(selector);

вместо

$find(selector);

К сожалению, jQuery не имеет этого встроенного. Действительно странно для многих лет развития. Мои обработчики AJAX не были применены к некоторым верхним элементам из-за того, как работает .find ().

4 голосов
/ 12 марта 2014

Принятый ответ очень неэффективен и фильтрует набор элементов, которые уже сопоставлены.

//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);
4 голосов
/ 13 мая 2010
$('selector').find('otherSelector').add($('selector').filter('otherSelector'))

Вы можете сохранить $('selector') в переменной для ускорения. Вы даже можете написать специальную функцию для этого, если вам это нужно:

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

$('selector').andFind('otherSelector')
2 голосов
/ 07 июня 2016

Если вы хотите, чтобы цепочка работала правильно, используйте фрагмент ниже.

$.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');
2 голосов
/ 30 августа 2013

Я знаю, что это старый вопрос, но есть более правильный путь. Если порядок важен, например, когда вы сопоставляете селектор типа :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);
};

Это не будет эффективным, но лучшее, что я придумала для поддержания правильного порядка.

1 голос
/ 20 октября 2017

Если вы строго смотрите в текущем узле (ах), вы просто делаете

$(html).filter('selector')
1 голос
/ 13 мая 2010

Я думаю andSelf - это то, что вы хотите:

obj.find(selector).andSelf()

Обратите внимание, что это всегда добавит обратно текущий узел, независимо от того, соответствует ли он селектору.

0 голосов
/ 01 января 2018

Если вы ищете ровно один элемент , либо текущий элемент, либо один внутри него, вы можете использовать:

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

Если вы ищете несколько элементов , вы можете использовать:

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

Использование andSelf / andBack довольно редко, не знаю почему. Возможно, из-за проблем с производительностью некоторые парни упоминали до меня.

(теперь я заметил, что Tgr уже дал это второе решение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...