jQuery seleziona per attributo utilizzando gli operatori AND e OR


105

Sto pensando, se è possibile in jQuery selezionare elementi mediante attributi denominati utilizzando 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>

Vorrei selezionare tutti gli elementi in cui myc="blue"ma solo quelli myidimpostati su 1 o 3.

Quindi ho provato:

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

ma non funziona, lo stesso qui:

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

È possibile senza scrivere funzioni di filtro speciali?


7
NB: Non dovresti inventare i tuoi attributi come myce myid. Se stai usando HTML5, anteponi loro data-: data-myce data-myid.
RoToRa

@RoToRa, c'è della documentazione in HTML5 che dice che dovresti farlo? La maggior parte dei siti web che vedo usa qualunque cosa pensi il cervello dello sviluppatore in quel momento ...
Alexis Wilke

1
Solo perché le persone lo fanno, non significa che sia corretto. Vedere la sezione HTML5 3.2.1 : "Gli autori non devono utilizzare elementi, attributi o valori di attributo non consentiti da questa specifica o da altre specifiche applicabili, poiché ciò rende notevolmente più difficile l'estensione del linguaggio in futuro."
RoToRa

1
È un cattivo esempio di una buona domanda. E i diversi tipi di elementi come gli input?
jesus g_force Harris

Risposte:


193

E funzionamento

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

Operazione OR , utilizzare 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 ilmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

2
se uso a=$('[myc="blue"] [myid="1"],[myid="3"]');vuol dire ([myc="blue"] AND [myid="1"]) OR [myid="3"]o ([myc="blue"]) AND ([myid="1"] OR [myid="3"]) sto cercando il secondo // Modifica: grazie per l'aggiornamento! :-)
Il Bndr


10

Che ne dici di scrivere un filtro come di seguito,

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

Modifica: @Jack Grazie .. totalmente mancato ..

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

DEMO


5

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

Non esiste tuttavia alcun raggruppamento o priorità, quindi devi ripetere una delle condizioni:

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

hai bisogno di quelle citazioni? Intendo solo per coerenza .. probabilmente solo io. >. <
Selvakumar Arumugam

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

5

Prima trova la condizione che si verifica in tutte le situazioni, quindi filtra le condizioni speciali:

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

1

Nel tuo caso speciale lo sarebbe

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

0

JQuery utilizza i selettori CSS per selezionare gli elementi, quindi devi solo usare più di una regola separandoli con virgole, in questo modo:

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

Modificare:

Mi spiace, volevi blu e 1 o 3. Che ne dici di:

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

Mettere insieme i due selettori di attributi ti dà AND, usando una virgola ti dà OR.


1
Penso che voglia ilmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

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

-1

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

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

In alternativa, è possibile eseguire la stenografia in un singolo selettore, dove i selettori di disturbo insieme agiscono come un ANDe la separazione con una virgola funge da OR:

var elements = $('[myc="blue"][myid="1"], [myid="3"]');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.