querySelectorAll birden çok koşulla


107

Birden fazla ilgisiz koşul kullanarak querySelectorAll ile arama yapmak mümkün müdür? Evet ise nasıl? Ve bunların VE veya VEYA kriterleri olup olmadığı nasıl belirlenir?

Örneğin:

Nasıl tüm bulmak için formun s, p ler ve efsane tek olan s querySelectorAll çağrısı? Mümkün?


" VE veya VEYA ölçütü " ile ne demek istediğinizden emin değilim . Buna bir örnek verebilir misiniz?
Bergi

Yanıtlar:


177

querySelectorAllBirden fazla ilgisiz koşul kullanarak arama yapmak mümkün müdür ?

Evet, çünkü querySelectorAlltam CSS seçicilerini kabul eder ve CSS, birden fazla ilgisiz seçici belirtmenize olanak tanıyan seçici gruplar kavramına sahiptir . Örneğin:

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

... bir form veya p veya olan herhangi bir öğeyi içeren bir liste döndürür legend.

CSS ayrıca başka bir konsepte de sahiptir: Daha fazla kritere göre kısıtlama. Bir seçicinin birden çok yönünü birleştirirsiniz. Örneğin:

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

... diğer öğeleri yok sayarak div, aynı zamanda ( ve ) sınıfa sahip tüm öğelerin bir listesini döndürür .foodiv

Elbette bunları birleştirebilirsiniz:

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

... aracı "Herhangi dahil olan divaynı zamanda sahip olduğu eleman foosınıfını, herhangi payrıca sahip eleman barsınıfını ve herhangi legendbir iç de var elemanı div."


document.querySelectorAll'dan tek bir sınıf kullanma imkanı var mı, örneğin var hotspots = document.querySelectorAll (". clickMapItem.text, .clickMapItem.multiImageText"); var i; for (i = 0; i <hotspots.length; i ++) {hotspots [i] .style.display = "none"; } İf else ifadesini kullanmam gerekiyor, bunun bir sınıf olup olmadığını kontrol etmek için yok veya başka bir şey. (sıcak noktalar [0 veya 1] .style.display == "yok") çalışmazsa.
Mile Mijatović

1
@MileMijatovic: Sorular yorum yerine soru olarak gönderilmelidir. Ama bakınız: stackoverflow.com/questions/25238153/…
TJ Crowder

Tamam ama genel olarak istediğimi yapmak mümkün mü? Bağlantı yardımcı olmadı
Mile Mijatović

Seçici gruplar konsepti 2018'de benim için hala işe yaradı ... paylaşım için teşekkürler
Eric Hepperle - CodeSlayer2010

17

Belgelere göre, herhangi bir css seçicide olduğu gibi, istediğiniz kadar koşul belirtebilirsiniz ve bunlar mantıksal 'VEYA' olarak değerlendirilir.

Bu örnek, belgedeki tüm div öğelerinin "not" veya "uyarı" sınıfıyla birlikte bir listesini döndürür:

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

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

Bu arada, 'VE' işlevini elde etmek için, örneğin, jquery'nin dediği gibi, basitçe bir çoklu özellik seçici kullanabilirsiniz:

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

ör. "input[id][name$='man']" öğenin hem kimliğini hem de adını belirtir ve her iki koşulun karşılanması gerekir. Sınıflar için .class1.class22 sınıfın nesnesini zorunlu kılmak " " kadar açıktır .

Her ikisinin tüm olası kombinasyonları geçerlidir, böylece daha karmaşık 'VEYA' ve 'VE' ifadelerinin eşdeğerlerini kolayca elde edebilirsiniz.


2
Yöntemin kendisi doğru olsa da, CSS'yi açıklamak için jQuery'ye başvurmaya gerek yoktur (özellikle OP'nin sorusu JavaScript ile sınırlı olduğundan).
Chaya Cooper


0

Saf JavaScript ile bunu (SQL gibi) ve ihtiyacınız olan her şeyi yapabilirsiniz, temel olarak:

<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
bu gerçekten soruyu cevaplamıyor, özellikle de how to specify whether those are AND or OR criteriabölüm, kabul edilen cevaba bakın
Meidan Alon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.