querySelectorAll con più condizioni


105

È possibile effettuare una ricerca per querySelectorAll utilizzando più condizioni non correlate? Se si come? E come specificare se si tratta di criteri AND o OR?

Per esempio:

Come trovare tutte le forme , p e legende con una singola chiamata querySelectorAll ? Possibile?


Non sono sicuro di cosa intendi per " criteri AND o OR ". Puoi fare un esempio per questo?
Bergi

Risposte:


176

È possibile effettuare una ricerca querySelectorAllutilizzando più condizioni non correlate?

Sì, perché querySelectorAllaccetta selettori CSS completi e CSS ha il concetto di gruppi di selettori , che ti consente di specificare più di un selettore non correlato. Per esempio:

var list = document.querySelectorAll("form, p, legend");

... restituirà un elenco contenente qualsiasi elemento che sia un form or p o legend .

I CSS hanno anche un altro concetto: limitare in base a più criteri. Devi solo combinare più aspetti di un selettore. Per esempio:

var list = document.querySelectorAll("div.foo");

... restituirà un elenco di tutti gli divelementi che hanno anche ( e ) la classe foo, ignorando gli altri divelementi.

Puoi, ovviamente, combinarli:

var list = document.querySelectorAll("div.foo, p.bar, div legend");

... che significa "Includi qualsiasi divelemento che abbia anche la fooclasse, qualsiasi pelemento che abbia anche la barclasse e qualsiasi legendelemento che sia anche dentro a div."


c'è la possibilità di usare una singola classe da document.querySelectorAll, per esempio ho var hotspots = document.querySelectorAll (". clickMapItem.text, .clickMapItem.multiImageText"); var i; for (i = 0; i <hotspots.length; i ++) {hotspots [i] .style.display = "none"; } Ho bisogno di usare l'istruzione if else, come controllare se si tratta di una classe che non visualizza nessuno o qualcos'altro. se (hotspots [0 o 1] .style.display == "none") non funziona.
Mile Mijatović

1
@MileMijatovic: le domande dovrebbero essere pubblicate come domande anziché come commenti. Ma vedi: stackoverflow.com/questions/25238153/…
TJ Crowder

Ok, ma in generale è possibile fare quello che ho chiesto? Il collegamento non ha aiutato
Mile Mijatović

Il concetto di gruppo di selezione ha funzionato per me ancora nel 2018 ... grazie per la condivisione
Eric Hepperle - CodeSlayer2010

17

Secondo la documentazione, proprio come con qualsiasi selettore CSS, puoi specificare tutte le condizioni che desideri e vengono trattate come "OR" logico.

Questo esempio restituisce un elenco di tutti gli elementi div all'interno del documento con una classe di "note" o "alert":

var matches = document.querySelectorAll("div.note, div.alert");

fonte: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll

Nel frattempo per ottenere la funzionalità 'AND' puoi ad esempio utilizzare semplicemente un selettore multiattributo, come dice jquery:

https://api.jquery.com/multiple-attribute-selector/

ex. "input[id][name$='man']" specifica sia l'ID che il nome dell'elemento ed entrambe le condizioni devono essere soddisfatte. Per le classi è ovvio come " .class1.class2" richiedere un oggetto di 2 classi.

Tutte le possibili combinazioni di entrambi sono valide, quindi puoi facilmente ottenere l'equivalente di espressioni "OR" e "AND" più sofisticate.


2
Sebbene il metodo stesso sia corretto, non è necessario fare riferimento a jQuery per spiegare CSS (soprattutto perché la domanda dell'OP è limitata a JavaScript).
Chaya Cooper


0

Con JavaScript puro puoi fare questo (come SQL) e tutto ciò di cui hai bisogno, in pratica:

<html>

<body>

<input type='button' value='F3' class="c2" id="btn_1">
<input type='button' value='F3' class="c3" id="btn_2">
<input type='button' value='F1' class="c2" id="btn_3">

<input type='submit' value='F2' class="c1" id="btn_4">
<input type='submit' value='F1' class="c3" id="btn_5">
<input type='submit' value='F2' class="c1" id="btn_6">

<br/>
<br/>

<button onclick="myFunction()">Try it</button>

<script>
    function myFunction() 
    {
        var arrFiltered = document.querySelectorAll('input[value=F2][type=submit][class=c1]');

            arrFiltered.forEach(function (el)
            {                
                var node = document.createElement("p");
                
                node.innerHTML = el.getAttribute('id');

                window.document.body.appendChild(node);
            });
        }
    </script>

</body>

</html>


1
questo non risponde veramente alla domanda, in particolare alla how to specify whether those are AND or OR criteriaparte, vedi risposta accettata
Meidan Alon
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.