O método transversal do jQuery find (..) não inclui o nó atual - ele começa com os filhos do nó atual. Qual é a melhor maneira de chamar uma operação de localização que inclua o nó atual em seu algoritmo de correspondência? Examinando os documentos, nada imediatamente salta para mim.
134
'selector'
duas vezes torna o encapsulamento extra desejável. YMMV'selector'
duas vezes (como mencionado por @ronen), você não poderia simplesmente usarobject.parent().find('selector')
??? - Dito isto, gosto da idéia de uma biblioteca que faz isso por você.object.parent().find('selector')
inclui irmãosobject
e seus descendentes.Você não pode fazer isso diretamente, o mais próximo que consigo pensar é usar
.andSelf()
e chamar.filter()
, assim:Infelizmente
.andSelf()
não é necessário um seletor, o que seria útil.fonte
closest(..)
inclui o elemento DOM atual e a árvore, enquanto todos os métodos transversais de árvore, comofind(..)
etc, não correspondem ao elemento atual. É como se a equipe do jQuery os tivesse implementado propositalmente, sem sobreposição quando as duas operações foram usadas juntas para uma pesquisa vertical completa.Definir
então use
ao invés de
Infelizmente, o jQuery não possui esse recurso. Realmente estranho por tantos anos de desenvolvimento. Meus manipuladores AJAX não foram aplicados a alguns dos principais elementos devido a como o .find () funciona.
fonte
filter()
lá, o que faz mais sentido.Você pode armazenar
$('selector')
em uma variável para acelerar. Você pode até escrever uma função personalizada para isso, se precisar muito:fonte
$('selector').find('otherSelector').add($('otherSelector'))
que você tem agora é equivalente.andSelf()
. Por fim, o.andFind()
filtro não é baseado na expressão, você precisaria.add($(this).filter(expr))
:) :)$('selector')
foi substituído por algum outro método de obter um objeto jQuery (se é isso que você quis dizer com não iniciar com um seletor), eleadd()
pode lidar com tudo da mesma maneira que$()
pode.$('selector')
pode estar$('selector').children('filter').closest('.class').last()
... pode estar em cadeia e você não tem idéia do que está adicionando, então a solução genérica deve pegar o objeto anterior como o filtro :)this
é qualquer objeto jQuery em que um plug-in foi chamado. Poderia ser o resultado de uma cadeia de chamadas.A resposta aceita é muito ineficiente e filtra o conjunto de elementos que já correspondem.
fonte
Se você deseja que o encadeamento funcione corretamente, use o trecho abaixo.
Após a chamada da função final, ele retorna o elemento #foo.
Sem definir plugins extras, você está preso a isso.
fonte
this
mais de um elementothis.is()
já estiver satisfeito, se apenas um deles corresponder.Caso esteja procurando exatamente um elemento , o atual ou o outro, pode usar:
Caso esteja procurando por vários elementos, você pode usar:
O uso de
andSelf
/andBack
é bastante raro, não sei por quê. Talvez por causa dos problemas de desempenho que alguns caras mencionaram antes de mim.(Agora notei que o Tgr já deu essa segunda solução)
fonte
Sei que essa é uma pergunta antiga, mas existe uma maneira mais correta. Se a ordem é importante, por exemplo, quando você está combinando um seletor como
:first
, escrevi uma pequena função que retornará exatamente o mesmo resultado como sefind()
realmente incluísse o conjunto atual de elementos:Não será eficiente de forma alguma, mas é o melhor que eu tenho para manter a ordem correta.
fonte
Eu acho
andSelf
que é o que você quer:Observe que isso sempre adicionará novamente o nó atual, independentemente de corresponder ou não ao seletor.
fonte
Se você está olhando estritamente nos nós atuais, simplesmente faz
fonte
Eu estava tentando encontrar uma solução que não se repita (ou seja, não insere o mesmo seletor duas vezes).
E essa pequena extensão jQuery faz isso:
Ele combina
find()
(apenas descendentes) comfilter()
(apenas o conjunto atual) e suporta os argumentos que ambos comem. OpushStack()
permite.end()
trabalhar como esperado.Use assim:
fonte
Aqui está a verdade certa (mas triste):
http://jsfiddle.net/SergeJcqmn/MeQb8/2/
fonte
$(selector)
do conjunto em todos os casos.