La méthode de traversée jQuery find (..) n'inclut pas le nœud actuel - elle commence par les enfants du nœud actuel. Quelle est la meilleure façon d'appeler une opération de recherche qui inclut le nœud actuel dans son algorithme de correspondance? En parcourant les documents, rien ne me saute immédiatement aux yeux.
134
'selector'
deux fois rend l'encapsulation particulièrement souhaitable. YMMV'selector'
deux fois (comme mentionné par @ronen), ne pourriez-vous pas simplement utiliserobject.parent().find('selector')
??? - cela étant dit, j'aime l'idée d'une librairie qui le fait pour vous.object.parent().find('selector')
comprend les frèresobject
et sœurs et leurs descendants.Vous ne pouvez pas faire cela directement, le plus proche auquel je puisse penser est d'utiliser
.andSelf()
et d'appeler.filter()
, comme ceci:Malheureusement,
.andSelf()
ne prend pas de sélecteur, ce qui serait pratique.la source
closest(..)
inclut l'élément DOM actuel et le haut de l'arborescence alors que toutes les méthodes de traversée vers le bas de l'arbre commefind(..)
etc ne correspondent pas à l'élément actuel. C'est comme si l'équipe jQuery les implémentait délibérément sans se chevaucher lorsque les deux opérations étaient utilisées ensemble pour une recherche verticale complète.Définir
puis utilisez
au lieu de
Malheureusement, jQuery n'a pas cette fonction intégrée. Vraiment étrange pour tant d'années de développement. Mes gestionnaires AJAX n'étaient pas appliqués à certains éléments principaux en raison du fonctionnement de .find ().
la source
filter()
, ce qui est plus logique.Vous pouvez stocker
$('selector')
dans une variable pour l'accélération. Vous pouvez même écrire une fonction personnalisée pour cela si vous en avez beaucoup besoin:la source
$('selector').find('otherSelector').add($('otherSelector'))
que vous avez maintenant équivaut à.andSelf()
. Enfin,.andFind()
ne filtre pas en fonction de l'expression, vous auriez besoin de.add($(this).filter(expr))
:)$('selector')
est remplacé par une autre méthode pour obtenir un objet jQuery (si c'est ce que vous vouliez dire en ne commençant pas par un sélecteur), iladd()
peut gérer tout comme le$()
peut.$('selector')
êtes peut-être$('selector').children('filter').closest('.class').last()
... il peut être dans une chaîne et vous n'avez aucune idée de ce qu'est cet objet que vous ajoutez, donc la solution générique devrait prendre l'objet précédent comme le filtre :)this
est n'importe quel objet jQuery sur lequel un plugin a été appelé. Cela pourrait tout aussi bien être le résultat d'une chaîne d'appels.La réponse acceptée est très inefficace et filtre l'ensemble des éléments qui correspondent déjà.
la source
Si vous souhaitez que le chaînage fonctionne correctement, utilisez l'extrait ci-dessous.
Après l'appel de la fonction end, elle renvoie l'élément #foo.
Sans définir de plugins supplémentaires, vous êtes coincé avec cela.
la source
this
plus d'un élémentthis.is()
est déjà satisfait si un seul d'entre eux correspond.Dans le cas où vous recherchez exactement un élément , soit l'élément actuel, soit un à l'intérieur, vous pouvez utiliser:
Si vous recherchez plusieurs éléments, vous pouvez utiliser:
L'utilisation de
andSelf
/andBack
est assez rare, je ne sais pas pourquoi. Peut-être à cause des problèmes de performances que certains gars ont mentionnés avant moi.(J'ai maintenant remarqué que Tgr a déjà donné cette deuxième solution)
la source
Je sais que c'est une vieille question, mais il existe une manière plus correcte. Si l'ordre est important, par exemple lorsque vous correspondez à un sélecteur comme
:first
, j'ai écrit une petite fonction qui retournera exactement le même résultat que si ellefind()
incluait réellement l'ensemble actuel d'éléments:Cela ne sera en aucun cas efficace, mais c'est le meilleur que j'ai trouvé pour maintenir un bon ordre.
la source
Je pense que
andSelf
c'est ce que tu veux:Notez que cela rajoutera toujours le nœud actuel, qu'il corresponde ou non au sélecteur.
la source
Si vous regardez strictement dans le ou les nœuds actuels, vous faites simplement
la source
J'essayais de trouver une solution qui ne se répète pas (c'est -à -dire ne pas entrer deux fois dans le même sélecteur).
Et cette petite extension jQuery le fait:
Il combine
find()
(uniquement les descendants) avecfilter()
(uniquement l'ensemble actuel) et prend en charge tous les arguments consommés. LepushStack()
permet.end()
de fonctionner comme prévu.Utilisez comme ceci:
la source
Voici la vérité juste (mais triste):
http://jsfiddle.net/SergeJcqmn/MeQb8/2/
la source
$(selector)
de l'ensemble dans tous les cas.