2012-05-21 8 views
73

Ci sto pensando, se è possibile in jQuery selezionare gli elementi per attributi denominati utilizzando AND e OR.jQuery seleziona per attributo utilizzando gli operatori AND e OR

Esempio:

<div myid="1" myc="blue">1</div> 
<div myid="2" myc="blue">2</div> 
<div myid="3" myc="blue">3</div> 
<div myid="4">4</div> 

mi piacerebbe per selezionare tutti gli elementi in cui myc="blue" ma solo quelli con myid impostato su 1 o 3.

Così ho provato:

a=$('[myc="blue"] [myid="1"] [myid="3"]'); 

ma non funziona, lo stesso qui:

a=$('[myc="blue"] && [myid="1"] || [myid="3"]'); 

E 'possibile senza scrivere funzioni speciali di filtro?

+6

NB: Non si dovrebbe fare il backup dei propri attributi come '' myc' e myid'. Se si sta usando il prefisso HTML5 con 'data-': 'data-myc' e' data-myid'. – RoToRa

+0

wow, 8 risposte in 10 minuti .. sembra che ho fatto una domanda noob. scusa! : -/ –

+1

@TheBndr No, è una domanda interessante e la maggior parte delle risposte ha approcci diversi e la tua domanda ha 3 upvotes + 2 fav .. sicuramente una buona domanda. –

risposta

132

E operazione

a=$('[myc="blue"][myid="1"][myid="3"]'); 

O operazione, utilizzare le virgole

a=$('[myc="blue"],[myid="1"],[myid="3"]'); 

Come ha commentato @Vega:

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]'); 
+1

Penso che voglia il 'myc == blue && (id == 1 || id == 3)' –

+1

se uso 'a = $ ('[myc =" blue "] [myid =" 1 "] , [myid = "3"] '); 'significa' ([myc = "blue"] AND [myid = "1"]) OR [myid = "3"] 'or' ([myc = "blu "]) AND ([myid =" 1 "] OR [myid =" 3 "])' Sto cercando il secondo // Modifica: grazie per l'aggiornamento! :-) –

11

Come circa la scrittura di un filtro come qui di seguito,

$('[myc="blue"]').filter(function() { 
    return (this.id == '1' || this.id == '3'); 
}); 

Edit: @Jack Thanks .. totalmente perso ..

$('[myc="blue"]').filter(function() { 
    var myId = $(this).attr('myid'); 
    return (myId == '1' || myId == '3'); 
}); 

DEMO

+0

È 'myid', non' id' :) –

+0

@Jack Totalmente perso quello .. Grazie! –

-1

JQuery utilizza selettori CSS per selezionare gli elementi, in modo che solo bisogno di utilizzare più di una regola da separandoli con virgole in questo modo:

a=$('[myc="blue"], [myid="1"], [myid="3"]'); 

Edit:

Siamo spiacenti, si voleva blu e 1 o 3. Che ne dite:

a=$('[myc="blue"][myid="1"], [myid="3"]'); 

Mettendo i due selettori di attributo insieme si dà e, utilizzando una virgola ti dà OR.

+1

Penso, lui vuole il 'myc == blue && (id == 1 || id == 3)' –

+0

Grazie Vega, aggiornato. – philnash

+0

È necessario ripetere il selettore '[myc =" blue "]' nel secondo esempio. – RoToRa

-1

Per selezionare correttamente gli elementi utilizzando le operazioni logiche che hai indicato, è sufficiente disporre di jQuery.filter() per l'operazione AND, non di "funzioni filtro speciali". È inoltre necessario jQuery.add() per l'operazione OR.

var elements = $('[myc="blue"]').filter('[myid="1"').add('[myid="3"'); 

In alternativa, è possibile realizzare con abbreviata in un singolo selettore, dove incepparsi selettori insieme funge AND e separati da una virgola agisce come OR:

var elements = $('[myc="blue"][myid="1"], [myid="3"]'); 
5

L'operatore AND un selettore è solo una stringa vuota e l'operatore o è la virgola.

Non c'è comunque raggruppamento o di priorità, in modo da avere a ripetere una delle condizioni:

a=$('[myc=blue][myid="1"],[myc=blue][myid="3"]'); 
+0

hai bisogno di quelle citazioni? Intendo solo per coerenza ... probabilmente solo per me. >. < –

+1

@Vega: Non hai bisogno di virgolette per stringhe semplici come 'blue', ma non ero sicuro dei valori numerici, quindi li ho mantenuti. – Guffa

1

Nel tuo caso particolare sarebbe

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]'); 
14

uso semplice .filter()[docs] (E) utilizzando la multiple selector[docs] (OR):

$('[myc="blue"]').filter('[myid="1"],[myid="2"]'); 

In generale, selettori concatenamento, li ke a.foo.bar[attr=value] è una specie di selettore AND.

jQuery ha extensive documentation sui selettori supportati, vale la pena leggere.

+0

lo sai, se questo è più veloce della risposta di gabe? –

+0

Non so, forse, forse no. –

5

Prima trovare la condizione che si verifica in tutte le situazioni, quindi filtrare le condizioni particolari:

$('[myc="blue"]') 
    .filter('[myid="1"],[myid="3"]');