Поиск метода поиска jQuery (..), который включает текущий node

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 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

Определить

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

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

$.findSelf(selector);

вместо

$find(selector);

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

Ответ 6

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

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

$.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

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

obj.find(selector).andSelf()

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

Ответ 9

Если вы строго смотрите текущий node (ы), вы просто просто

$(html).filter('selector')