querySelectorAll ที่มีหลายเงื่อนไข


110

เป็นไปได้ไหมที่จะทำการค้นหาโดยใช้ querySelectorAll โดยใช้เงื่อนไขที่ไม่เกี่ยวข้องหลาย ๆ ถ้าใช่อย่างไร และจะระบุได้อย่างไรว่าสิ่งเหล่านั้นเป็นเกณฑ์ AND หรือ OR?

ตัวอย่างเช่น:

วิธีค้นหาแบบฟอร์ม s, p s และตำนาน s ทั้งหมดด้วยแบบสอบถามเดียวตัวเลือกการโทรทั้งหมด? เป็นไปได้ไหม


ฉันไม่แน่ใจว่า " เกณฑ์ AND หรือ OR " หมายถึงอะไร คุณสามารถยกตัวอย่างได้หรือไม่?
Bergi

4
เอกสารครอบคลุมนี้ในตัวอย่างแรก
Andy

คำตอบ:


185

เป็นไปได้ไหมที่จะทำการค้นหาโดยquerySelectorAllใช้เงื่อนไขที่ไม่เกี่ยวข้องหลาย ๆ

ใช่เนื่องจากquerySelectorAllยอมรับตัวเลือก CSS แบบเต็มและ CSS มีแนวคิดของกลุ่มตัวเลือกซึ่งช่วยให้คุณระบุตัวเลือกที่ไม่เกี่ยวข้องได้มากกว่าหนึ่งตัว ตัวอย่างเช่น:

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

... จะกลับรายการที่มีองค์ประกอบใด ๆ ที่เป็นform หรือ หรือp legend

CSS ยังมีแนวคิดอื่น ๆ : การ จำกัด ตามเกณฑ์ที่มากขึ้น คุณเพียงแค่รวมหลายแง่มุมของตัวเลือก ตัวอย่างเช่น:

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

... จะกลับรายการของทุกdivองค์ประกอบที่ยัง ( และ ) มีชั้นเรียนfooโดยไม่สนใจอื่น ๆdivองค์ประกอบ

แน่นอนคุณสามารถรวมเข้าด้วยกัน:

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

... ซึ่งหมายความว่า "รวมdivองค์ประกอบใด ๆที่มีfooคลาสpองค์ประกอบใด ๆที่มีbarคลาสและlegendองค์ประกอบใด ๆที่อยู่ใน a divด้วย"


มีความเป็นไปได้หรือไม่ที่จะใช้คลาสเดียวจาก document.querySelectorAll เช่น I have var hotspots = document.querySelectorAll (". clickMapItem.text, .clickMapItem.multiImageText"); var ฉัน; สำหรับ (i = 0; i <hotspots.length; i ++) {hotspots [i] .style.display = "none"; } ฉันต้องการใช้คำสั่ง if else วิธีตรวจสอบว่าเป็น class display none หรืออย่างอื่น ถ้า (ฮอตสปอต [0 หรือ 1] .style.display == "ไม่มี") ไม่ทำงาน
Mile Mijatović

1
@MileMijatovic: คำถามควรโพสต์เป็นคำถามแทนที่จะแสดงความคิดเห็น แต่ดู: stackoverflow.com/questions/25238153/…
TJ Crowder

โอเค แต่โดยทั่วไปเป็นไปได้ไหมที่จะทำตามที่ฉันขอ? ลิงค์ไม่ได้ช่วย
Mile Mijatović

แนวคิดของกลุ่มผู้เลือกใช้งานได้สำหรับฉันในปี 2018 ... ขอบคุณสำหรับการแบ่งปัน
Eric Hepperle - CodeSlayer2010

17

ตามเอกสารประกอบเช่นเดียวกับตัวเลือก css คุณสามารถระบุเงื่อนไขได้มากเท่าที่คุณต้องการและถือว่าเป็นตรรกะ 'OR'

ตัวอย่างนี้แสดงรายการขององค์ประกอบ div ทั้งหมดภายในเอกสารโดยมีคลาสเป็น "note" หรือ "alert":

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

ที่มา: https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll

ในขณะเดียวกันเพื่อรับฟังก์ชั่น 'AND' คุณสามารถใช้ตัวเลือก multiattribute ดังที่ jquery กล่าวว่า:

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

เช่น "input[id][name$='man']" ระบุทั้ง id และชื่อขององค์ประกอบและต้องตรงตามเงื่อนไขทั้งสอง สำหรับคลาสนั้นชัดเจนพอ ๆ กับ " .class1.class2" ที่ต้องการอ็อบเจกต์ 2 คลาส

ชุดค่าผสมที่เป็นไปได้ทั้งหมดของทั้งสองอย่างนั้นใช้ได้ดังนั้นคุณจึงสามารถเทียบเท่ากับนิพจน์ 'OR' และ 'AND' ที่ซับซ้อนกว่าได้อย่างง่ายดาย


2
แม้ว่าวิธีการนั้นจะถูกต้อง แต่ก็ไม่จำเป็นต้องอ้างอิง jQuery เพื่ออธิบาย CSS (โดยเฉพาะอย่างยิ่งเนื่องจากคำถามของ OP จำกัด เฉพาะ JavaScript)
Chaya Cooper


1

ด้วย JavaScript บริสุทธิ์คุณสามารถทำได้ (เช่น SQL) และทุกสิ่งที่คุณต้องการโดยพื้นฐาน:

<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
สิ่งนี้ไม่ได้ตอบคำถามจริงๆโดยเฉพาะhow to specify whether those are AND or OR criteriaส่วนดูคำตอบที่ยอมรับ
Meidan Alon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.