querySelectorAll z wieloma warunkami


109

Czy można przeprowadzić wyszukiwanie za pomocą querySelectorAll, używając wielu niepowiązanych warunków? Jeśli tak, to jak? A jak określić, czy są to kryteria AND czy OR?

Na przykład:

Jak znaleźć wszystkie formularze s, p si legendy za pomocą jednego wywołania querySelectorAll ? Możliwy?


Nie jestem pewien, co masz na myśli, mówiąc „ kryterium AND lub OR ”. Czy możesz podać na to przykład?
Bergi

Odpowiedzi:


184

Czy można przeprowadzić wyszukiwanie przy querySelectorAllużyciu wielu niepowiązanych ze sobą warunków?

Tak, ponieważ querySelectorAllakceptuje pełne selektory CSS, a CSS ma koncepcję grup selektorów , która pozwala określić więcej niż jeden niepowiązany selektor. Na przykład:

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

... zwróci listę zawierającą dowolny element, który jest form lub p lub legend .

CSS ma również inną koncepcję: ograniczanie oparte na większej liczbie kryteriów. Po prostu łączysz wiele aspektów selektora. Na przykład:

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

... zwróci listę wszystkich divelementów, które również ( i ) mają klasę foo, ignorując inne divelementy.

Możesz je oczywiście łączyć:

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

... co oznacza „Uwzględnij każdy divelement, który również ma fooklasę, każdy pelement, który również ma barklasę, i każdy legendelement, który również znajduje się wewnątrz a div”.


czy istnieje możliwość użycia jednej klasy z document.querySelectorAll, na przykład mam var hotspots = document.querySelectorAll (". clickMapItem.text, .clickMapItem.multiImageText"); var i; for (i = 0; i <hotspots.length; i ++) {hotspots [i] .style.display = "none"; } Muszę użyć instrukcji if else, jak sprawdzić, czy jest to klasa, wyświetl none lub coś innego. if (hotspots [0 lub 1] .style.display == "none") nie działa.
Mile Mijatović

1
@MileMijatovic: Pytania należy publikować jako pytania, a nie komentarze. Ale zobacz: stackoverflow.com/questions/25238153/…
TJ Crowder

Ok, ale ogólnie czy można zrobić to, o co prosiłem? Link nie pomógł
Mile Mijatović

Koncepcja grup selektorów działała dla mnie jeszcze w 2018 ... dzięki za udostępnienie
Eric Hepperle - CodeSlayer2010

17

Zgodnie z dokumentacją, tak jak w przypadku każdego selektora css, możesz określić dowolną liczbę warunków i są one traktowane jako logiczne „LUB”.

Ten przykład zwraca listę wszystkich elementów div w dokumencie z klasą „note” lub „alert”:

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

źródło: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll

W międzyczasie, aby uzyskać funkcjonalność „AND”, możesz na przykład po prostu użyć selektora wielu atrybutów, jak mówi jquery:

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

dawny. "input[id][name$='man']" określa zarówno id, jak i nazwę elementu i oba warunki muszą być spełnione. Dla klas jest tak oczywiste, jak .class1.class2wymaganie obiektu dwóch klas.

Wszystkie możliwe kombinacje obu są poprawne, więc możesz łatwo uzyskać odpowiednik bardziej wyrafinowanych wyrażeń „LUB” i „ORAZ”.


2
Chociaż sama metoda jest poprawna, nie ma potrzeby odwoływania się do jQuery w celu wyjaśnienia CSS (zwłaszcza, że ​​pytanie OP jest ograniczone do JavaScript).
Chaya Cooper


1

Za pomocą czystego JavaScript możesz to zrobić (na przykład SQL) i wszystko, czego potrzebujesz, w zasadzie:

<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
to tak naprawdę nie odpowiada na pytanie, a konkretnie na how to specify whether those are AND or OR criteriaczęść, patrz zaakceptowana odpowiedź
Meidan Alon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.