JQuery: obtenha ancestrais (ou descendentes) e eu
-
22-09-2019 - |
Pergunta
Pode -se usar matchedset.find(selector)
/ matchedset.parents(selector)
Para obter os descendentes/ancestrais do conjunto atual correspondente filtrado por um seletor, mas isso não inclui o conjunto correspondente (se ele também corresponde ao seletor). Existe uma maneira melhor (mais concisa e/ou mais rápida) de obtê -lo do que
matchedset.find(selector).add(matchedset.filter(selector))
e os respectivos para os pais ()?
Solução
Você consegue fazer isso:
matchedset.find('*').andSelf().filter(selector);
Para os pais:
matchedset.parents('*').andSelf().filter(selector);
Outras dicas
Eu acho que seu método é eficiente em termos de tempo de execução, mas o que você provavelmente está pedindo é o açúcar sintático. Para isso, você pode envolvê -lo em um plugin:
jQuery.fn.findAndSelf = function(selector) {
return this.find(selector).add(this.filter(selector))
}
Em seguida, use assim:
$('.whatever').findAndSelf('.awesome')
Se você quisesse se buscar, poderia criar um plugin que funcione não apenas para 'encontrar', mas para 'pais' e 'filhos' e outros plugins baseados em seletor:
jQuery.fn.withSelf = function(plugin, selector) {
return this[plugin](selector).add(this.filter(selector))
}
Então você fornece como o primeiro argumento do plug -in Traversal que deseja ligar:
$('.whatever').withSelf('find', '.awesome')
$('.whatever').withSelf('parents', '.awesome')
Apenas para chutes, outro plugin divertido que permite chamar um número arbitrário de plugins de travessia de uma só vez:
jQuery.fn.traverse = function(plugins, selector) {
var set = new jQuery();
$.each(plugins, function(i, val) {
set.add(this[val](selector));
}
return set
}
Você pode invocar este com qualquer combinação de plugins baseados em seletor, como segue:
$('.whatever').traverse(['find','filter'], '.awesome')
$('.whatever').traverse(['parents','find'], '.awesome')
$('.whatever').traverse(['parents', 'filter'], '.awesome')
Embora a solução de Jeoff seja boa, às vezes é bom poder iterar todos os elementos, inclusive a si mesmo sem um seletor. Este complemento é um pouco mais flexível:
$.fn.all = function(selector) {
if(selector===window.undefined) return this.find('*').andSelf();
return this.filter(selector).add(this.find(selector));
};
Procure a função "ANDELE ()".
Para os pais que você tem closest(selector)