Existe-t-il une fonction similaire à jQuery
.closest()
mais pour parcourir les descendants et ne renvoyer que les plus proches?
Je sais qu'il y a une .find()
fonction, mais elle renvoie toutes les correspondances possibles, pas les plus proches.
Éditer:
Voici la définition du plus proche (du moins pour moi) :
En premier lieu, tous les enfants sont traversés, puis chaque enfant individuel est traversé.
Dans l'exemple ci id='2'
- dessous, les .closest
descendants les plus proches deid="find-my-closest-descendant"
<div id="find-my-closest-descendant">
<div>
<div class="closest" Id='1'></div>
</div>
<div class="closest" Id='2'></div>
</div>
Veuillez consulter le lien JSfiddle .
.find("filter here").eq(0)
?:first
filtre?Réponses:
Selon votre définition de
closest
, j'ai écrit le plugin suivant:la source
.closest()
fonction jQuery , cela correspond également à l'élément sur lequel elle a été appelée. Voir mon jsfiddle . En le changeant, il$currentSet = this.children(); // Current place
commencera par ses enfants à la place jsfiddleSi par descendant "le plus proche" vous entendez le premier enfant, vous pouvez faire:
Ou:
Ou, pour rechercher la première occurrence d'un élément spécifique, vous pouvez faire:
Ou:
En réalité, nous avons besoin d'une définition solide de ce que signifie «descendant le plus proche».
Par exemple
Ce qui
<span>
serait de$('#foo').closestDescendent('span')
retour?la source
$('#foo').find('.whatever').first();
"largeur d'abord" ou "profondeur d'abord"Vous pouvez utiliser
find
avec le:first
sélecteur:La ligne ci-dessus trouvera le premier
<p>
élément dans les descendants de#parent
.la source
find('whatever:first')
.Et cette approche?
Ce sélecteur "enfant direct" fonctionne pour moi.
la source
Solution Pure JS (utilisant ES6).
Exemple
Compte tenu de la structure suivante:
Afficher l'extrait de code
la source
while
expression ayant des effets secondaires. 2) Utilisation du.matches
chèque sur deux lignes au lieu d'une seule.Au cas où quelqu'un recherche une solution JS pure (en utilisant ES6 au lieu de jQuery), voici celle que j'utilise:
la source
matches
deux fois me dérange aussi un peu). +1 pour vous :)Je pense que vous devez d'abord définir ce que signifie «le plus proche». Si vous voulez dire le nœud descendant correspondant à vos critères qui est la distance la plus courte en termes de liens parentaux, alors utiliser ": first" ou ".eq (0)" ne fonctionnera pas nécessairement:
Dans cet exemple, le deuxième
<span>
élément ".target" est "plus proche" du "début"<div>
, car il n'est qu'à un saut parental. Si c'est ce que vous entendez par «le plus proche», vous devez trouver la distance minimale dans une fonction de filtre. La liste de résultats d'un sélecteur jQuery est toujours dans l'ordre DOM.Peut être:
C'est une sorte de plugin de piratage en raison de la façon dont il construit l'objet de résultat, mais l'idée est que vous devez trouver le chemin parental le plus court parmi tous les éléments correspondants que vous trouvez. Ce code fait un biais vers les éléments vers la gauche dans l'arborescence DOM à cause de la
<
vérification;<=
serait biaisé à droite.la source
J'ai concocté ceci, pas d'implémentation pour les sélecteurs de position (ils ont besoin de plus que juste
matchesSelector
) pour le moment:Démo: http://jsfiddle.net/TL4Bq/3/
Il y a probablement quelques bugs cependant, je ne l'ai pas beaucoup testé.
la source
La réponse de Rob W n'a pas vraiment fonctionné pour moi. Je l'ai adapté à cela qui a fonctionné.
la source
.find(filter).first()
, mais plus lentement;)J'utiliserais ce qui suit pour inclure la cible elle-même si elle correspond au sélecteur:
Balisage:
la source
Même si c'est un vieux sujet, je n'ai pas pu résister à l'implémentation de mon enfant le plus proche. Fournit le premier descendant trouvé avec le moins de déplacements (souffle d'abord). L'un est récursif (favori personnel), l'autre utilise une liste de tâches donc sans récursivité comme extensions jQquery.
J'espère que quelqu'un en profitera.
Remarque: le récursif obtient un débordement de pile, et j'ai amélioré l'autre, maintenant similaire à la réponse précédente donnée.
la source
Le plugin suivant renvoie le nième descendant le plus proche.
la source
Je cherchais une solution similaire (je voulais tous les descendants les plus proches, c'est-à-dire la largeur en premier + toutes les correspondances quel que soit le niveau auquel elle existe), voici ce que j'ai fini par faire:
J'espère que ça aide.
la source
Vous pouvez simplement dire,
la source
Il y a un excellent article qui souligne que ce que l'OP exige peut être réalisé facilement avec le plus proche [Geeks for Geeks]
1 https://www.geeksforgeeks.org/jquery-closest-with-examples/
la source
vous avez beaucoup d'options, mais
$("#parent").children(".child");
le fastet. consultez cet article pour plus de détails et de référencela source