jQuery find (..) метод обхода не включает текущий node - он начинается с дочерних элементов текущего node. Каков наилучший способ вызвать операцию поиска, которая включает текущий node в свой алгоритм сопоставления? Просматривая документы, ничто сразу не выпрыгивает на меня.
Поиск метода поиска jQuery (..), который включает текущий 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')
Ответ 10
Здесь правая (но грустная) истина:
$(selector).parent().find(oSelector).filter($(selector).find('*'))