2010-10-27 4 views
3

Existe-t-il un moyen de combiner un sélecteur multiple et un filtre de base dans une même requête?Combiner un sélecteur multiple avec un filtre

Par exemple ...

var jq = $(someElement); 

// Want to find the first following sibling node which has either classA or classB. 

// This imaginary jquery does not quite work. 
jq.nextAll("(.classA, .classB):first") 

// This works. But I wonder if I can achieve the same result with just one query. 
jq.nextAll(".classA, classB)").filter(":first") 

Répondre

2

ne sais pas exactement ce que vous essayez de faire, mais si vous voulez juste le innerHTML du premier élément, vous devriez être capable de faire quelque chose comme:

$(".classA, .classB", someElement).html(); 

depuis html agira sur la première correspondance élément.

Sinon, je ne vois pas quel est le problème avec votre méthode qui fonctionne ... Je suppose que vous demandez simplement des connaissances supplémentaires?

Je trouve jamais besoin de beaucoup pour la: première selectorbut je ferais probablement cela comme:

$(".classA, .classB", someElement).first(); 
+0

Merci pour la réponse, Andy. S'il y a plusieurs éléments correspondant à la première requête, est-ce que jquery trouve toutes les correspondances et choisit la première? Je pensais que le faire en une seule requête permettrait à jquery de savoir que je ne suis intéressé que par le premier élément, de sorte que jquery arrêtera de chercher n'importe quelle autre correspondance - rendant la requête plus rapide. Peut être? Peut être pas? – Kei

+1

C'est intéressant. J'ai essayé de regarder à travers la source jQuery mais pas assez bien pour comprendre exactement ce qui se passe. Ce que j'ai trouvé, c'est que la première fonction est juste un alias de la fonction eq, qui appelle 'this.slice (i, + i + 1)' où 'this' est le résultat. Donc, je suppose que peu importe comment vous parlez de ces types de sélecteurs compliqués, il saisit tous les résultats, puis les filtrer. Ce n'est que spéculation de ce que je pouvais voir si. Je ne sais vraiment pas comment ça fonctionne. –

+1

@Kei Il n'y a aucun moyen de dire à jQuery de s'arrêter quand il trouve le premier match pour le moment. Voir: http://stackoverflow.com/questions/3950888 –

5

si vous .first() au lieu de .filter(":first")?

Cela aide-t-il?

2

bien im assez sûr que ce soit la même chose et utilise une seule requête:

jq.nextAll('.classA:first, .classB:first'); 

Il est évident que son mroe bavard mais à moins qu'il ya quelque chose de spécial au sujet du sélecteur :first qui devrait fonctionner.

+0

je considérais cette suggestion ... Est-il revenir un résultat, ou le premier résultat qui correspond soit classe (deux résultats)? Je n'étais pas vraiment sûr donc je me suis arrêté mais je suis curieux de savoir si cela fonctionne effectivement et je n'ai pas envie de tester: -P –

+3

Cela donnera (potentiellement) deux résultats. http://jsbin.com/igufu3/ – user113716

+0

Ill aller avec ce que patirick dit puisque je n'ai pas testé et ne me suis jamais utilisé :-) – prodigitalson

1

Essayez ceci:

var first = jq.nextAll('.classA, .classB').first(); 

Exemple de here.

Questions connexes