Ответ 1
Вы можете сделать это:
matchedset.find('*').andSelf().filter(selector);
Для родителей:
matchedset.parents('*').andSelf().filter(selector);
Можно использовать matchedset.find(selector)
/matchedset.parents(selector)
, чтобы получить потомки/предки текущего сопоставленного набора, отфильтрованного селектором, но это не включает сам сопоставленный набор (если он также соответствует селектору). Есть ли лучший (более сжатый и/или более быстрый) способ получить его, чем
matchedset.find(selector).add(matchedset.filter(selector))
и соответствующее для родителей()?
Вы можете сделать это:
matchedset.find('*').andSelf().filter(selector);
Для родителей:
matchedset.parents('*').andSelf().filter(selector);
Я думаю, что ваш метод эффективен с точки зрения времени выполнения, но то, что вы, вероятно, просите, это синтаксический сахар. Для этого вы можете вставить его в плагин:
jQuery.fn.findAndSelf = function(selector) {
return this.find(selector).add(this.filter(selector))
}
Затем используйте его следующим образом:
$('.whatever').findAndSelf('.awesome')
Если вы хотите получить фантазию, вы можете создать плагин, который работает не только для "find", но и для "родителей" и "детей" и других плагинов на основе селектора:
jQuery.fn.withSelf = function(plugin, selector) {
return this[plugin](selector).add(this.filter(selector))
}
Затем вы должны указать в качестве первого аргумента плагин перемещения, который вы хотите вызвать:
$('.whatever').withSelf('find', '.awesome')
$('.whatever').withSelf('parents', '.awesome')
Просто для пинков, еще один плагин для удовольствия, который позволяет вам одновременно вызвать произвольное количество плагинов обхода:
jQuery.fn.traverse = function(plugins, selector) {
var set = new jQuery();
$.each(plugins, function(i, val) {
set.add(this[val](selector));
}
return set
}
Вы можете вызвать этот код с любой комбинацией плагинов на основе селектора, как показано ниже:
$('.whatever').traverse(['find','filter'], '.awesome')
$('.whatever').traverse(['parents','find'], '.awesome')
$('.whatever').traverse(['parents', 'filter'], '.awesome')
В то время как решение Jeoff приятно, иногда приятно иметь возможность перебирать все элементы, включая себя без селектора. Это дополнение немного более гибкое:
$.fn.all = function(selector) {
if(selector===window.undefined) return this.find('*').andSelf();
return this.filter(selector).add(this.find(selector));
};
Найдите функцию "andSelf()".
Для родителей у вас есть closest(selector)