วิธีใช้ querySelectorAll เฉพาะสำหรับองค์ประกอบที่มีชุดแอตทริบิวต์เฉพาะ


124

ฉันกำลังพยายามใช้document.querySelectorAllสำหรับช่องทำเครื่องหมายทั้งหมดที่มีvalueชุดแอตทริบิวต์

มีช่องทำเครื่องหมายอื่น ๆ บนหน้าที่ไม่ได้valueตั้งค่าไว้และค่าจะแตกต่างกันสำหรับแต่ละช่องทำเครื่องหมาย รหัสและชื่อไม่ซ้ำกัน

ตัวอย่าง: <input type="checkbox" id="c2" name="c2" value="DE039230952"/>

ฉันจะเลือกเฉพาะช่องทำเครื่องหมายที่ตั้งค่าไว้ได้อย่างไร


1
รวมช่องว่างด้วยหรือไม่ ชอบvalues=""
โจเซฟ

ช่องทำเครื่องหมายอื่น ๆ ไม่มีค่าเลยดังนั้นจึงไม่จำเป็นต้องรวมไว้ด้วย
Soryn

คำตอบ:


217

คุณสามารถใช้querySelectorAll()สิ่งนี้:

var test = document.querySelectorAll('input[value][type="checkbox"]:not([value=""])');

สิ่งนี้แปลเป็น:

รับอินพุตทั้งหมดที่มีแอตทริบิวต์ "value" และมีแอตทริบิวต์ "value" ที่ไม่ว่างเปล่า

ในการสาธิตนี้จะปิดใช้งานช่องทำเครื่องหมายด้วยค่าที่ไม่ว่างเปล่า


จะเลือกเฉพาะอินพุตประเภทช่องทำเครื่องหมายได้อย่างไร? มีแท็กอินพุตอื่น ๆ อีกมากมายที่มีแอตทริบิวต์ค่า แต่ฉันต้องการช่องทำเครื่องหมายเท่านั้น
Soryn

1
@Soryn เพิ่ม[type="checkbox"]. อัปเดตคำตอบของฉัน
โจเซฟ

2
คำตอบที่ดี! สิ่งนี้ช่วยลดความจำเป็นส่วนใหญ่ในการรวม jQuery ในไลบรารีขนาดเล็กสำหรับการส่งผ่าน DOM ฉันมีเคล็ดลับเพิ่มเติมในคำตอบด้านล่าง
mattdlockyer

คุณช่วยบอกฉันได้ไหมว่าอินพุตไวยากรณ์นี้คืออะไร [value] [type = "checkbox"]: not ([value = ""] ฉันไม่เห็นไวยากรณ์แบบนี้มาก่อนใน javascript
blackHawk

@blackHawk ไวยากรณ์ใช้ CSS Selectors ตามที่MDNระบุไว้"คือสตริงที่มีตัวเลือก CSS อย่างน้อยหนึ่งตัวคั่นด้วยเครื่องหมายจุลภาค" คุณสามารถอ่านเกี่ยวกับ CSS Selectors ที่นี่
martieva

21

เคล็ดลับพิเศษ:

"nots" หลายรายการอินพุตที่ไม่ได้ซ่อนและไม่ปิดใช้งาน:

:not([type="hidden"]):not([disabled])

คุณรู้หรือไม่ว่าคุณสามารถทำได้:

node.parentNode.querySelectorAll('div');

สิ่งนี้เท่ากับ jQuery's:

$(node).parent().find('div');

ซึ่งจะค้นหา div ทั้งหมดใน "node" และด้านล่างซ้ำได้อย่างมีประสิทธิภาพ HOT DAMN!


20

ด้วยตัวอย่างของคุณ:

<input type="checkbox" id="c2" name="c2" value="DE039230952"/>

แทนที่ $$ ด้วย document.querySelectorAll ในตัวอย่าง:

$$('input') //Every input
$$('[id]') //Every element with id
$$('[id="c2"]') //Every element with id="c2"
$$('input,[id]') //Every input + every element with id
$$('input[id]') //Every input including id
$$('input[id="c2"]') //Every input including id="c2"
$$('input#c2') //Every input including id="c2" (same as above)
$$('input#c2[value="DE039230952"]') //Every input including id="c2" and value="DE039230952"
$$('input#c2[value^="DE039"]') //Every input including id="c2" and value has content starting with DE039
$$('input#c2[value$="0952"]') //Every input including id="c2" and value has content ending with 0952
$$('input#c2[value*="39230"]') //Every input including id="c2" and value has content including 39230

ใช้ตัวอย่างโดยตรงกับ:

const $$ = document.querySelectorAll.bind(document);

เพิ่มเติมบางส่วน:

$$(.) //The same as $([class])
$$(div > input) //div is parent tag to input
document.querySelector() //equals to $$()[0] or $()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.