2010-12-10 37 views
9

Vu le code XML suivant:Comment combiner un OR logique avec AND logique dans un sélecteur d'attribut jQuery?

<users> 
    <user state="CA" sex="m">Max</user> 
    <user state="AZ" sex="f">Jen</user> 
    <user state="OR" sex="f">Kim</user> 
    <user state="NV" sex="m">Bob</user> 
    <user state="CA" sex="m">Jon</user> 
    <user state="AZ" sex="m">Jim</user> 
    <user state="OR" sex="f">Joy</user> 
    <user state="NV" sex="f">Amy</user> 
</users> 

En utilisant jQuery, est-il possible de sélectionner les utilisateurs qui sont des hommes et sont soit de CA ou NV, mais sans utiliser la fonction de filtre? Pour être clair, je sais que

$(xml).find("user[sex='m']") 

sélectionne uniquement les utilisateurs masculins, alors que

$(xml).find("user[state='CA'],[state='NV']") 

sélectionne tous les utilisateurs de CA ou du NV. Mais je ne suis pas capable de combiner les deux avec un ET logique dans un seul sélecteur.

Utilisation de la fonction de filtre, cependant, les travaux suivants:

$(xml).find("user").filter(function() { 
    return $(this).attr('sex') == 'm' && ($(this).attr('state') == 'CA' || $(this).attr('state') == 'NV') 
}).each(function() { 
    alert($(this).text()); 
}); 

Merci!

Répondre

19

Essayez ceci:

$(xml).find("user[sex='m'][state='CA'], user[sex='m'][state='NV']") 

Fondamentalement, vous enchaînez les sex et state attributs ensemble dans un sélecteur simple et unique (ce serait votre logique), et les répéter une fois par l'Etat (et ce serait votre logique OU).

Test:

$(xml).find("user[sex='m'][state='CA'], user[sex='m'][state='NV']") 
     .each(function() { 
      alert($(this).text() + " - " + $(this).attr('state')); 
     }); 

Sortie:

Max - CA 
Bob - NV 
Jon - CA 
+0

fonctionne comme un charme, merci! – user537264

+0

Cela devient répétitif, mais en ce qui concerne l'utilisation des sélecteurs, c'est bien cela. Assurez-vous de cliquer sur la coche pour accepter la réponse que vous préférez. – BoltClock

+0

Toutes les règles du sélecteur suivent la grammaire css http://www.w3.org/TR/CSS2/grammar.html – Incognito

1

Vous pouvez combiner plusieurs sélecteurs, mais votre syntaxe est pas exactement correct:

$(xml).find("user[state='CA'],[state='NV']") 

Ceci trouve tous les utilisateurs < > éléments avec l'état "CA" et tous les autres noeuds (pas nécessairement <utilisateur>) avec l'état "NV". Ce que vous voulez est:

$(xml).find("user[state=CA][sex=m],user[state=NV][sex=m]") 

Si vous ne voulez pas vous répéter:

$(xml).find("user").filter("[state='CA'],[state='NV']").filter("[sex='m']"); 
+0

Merci pour les précisions sur la syntaxe. Je ne me suis pas rendu compte. – user537264