ค้นหาองค์ประกอบใน DOM ตามค่าแอททริบิว


252

คุณช่วยบอกฉันได้ไหมถ้ามี DOM API ที่ค้นหาองค์ประกอบด้วยชื่อแอตทริบิวต์ที่กำหนดและค่าแอตทริบิวต์:

สิ่งที่ต้องการ:

doc.findElementByAttribute("myAttribute", "aValue");

1
ทำซ้ำหากคุณกำลังมองหา Jquery Sol: stackoverflow.com/questions/696968/…
Rajat

13
คุณช่วยอัพเดทคำตอบที่ได้รับการยอมรับให้กับโซลูชั่นที่ทันสมัยคำตอบของ Wojtek ได้หรือไม่?
Nick Craver

คำตอบ:


165

ปรับปรุง:ในไม่กี่ปีที่ผ่านมาภูมิทัศน์มีการเปลี่ยนแปลงอย่างมาก ตอนนี้คุณสามารถใช้อย่างน่าเชื่อถือquerySelectorและquerySelectorAllดูคำตอบของ Wojtekสำหรับวิธีการทำสิ่งนี้

ไม่จำเป็นต้องพึ่งพาการใช้ jQuery หากคุณใช้ jQuery ยอดเยี่ยม ... หากคุณไม่ได้ใช้งานคุณไม่จำเป็นต้องพึ่งมันเพียงเลือกองค์ประกอบตามคุณลักษณะอีกต่อไป


ไม่มีวิธีที่สั้นมากในการทำเช่นนี้ในวานิลลาจาวาสคริปต์ แต่มีวิธีแก้ปัญหาบางอย่าง

คุณทำสิ่งนี้โดยวนลูปผ่านองค์ประกอบต่างๆและตรวจสอบคุณสมบัติ

หากไลบรารีอย่างjQueryเป็นตัวเลือกคุณสามารถทำได้ง่ายขึ้นเช่นนี้

$("[myAttribute=value]")

หากค่านั้นไม่ใช่ตัวระบุ CSS ที่ถูกต้อง(มีช่องว่างหรือเครื่องหมายวรรคตอนอยู่ในนั้น ฯลฯ ) คุณต้องมีเครื่องหมายอัญประกาศรอบค่า (อาจเป็นแบบเดี่ยวหรือคู่):

$("[myAttribute='my value']")

นอกจากนี้คุณยังสามารถทำstart-with, ends-with, containsฯลฯ ... มีหลายตัวเลือกสำหรับการเลือกแอตทริบิวต์


6
อันที่จริงวานิลลา JavaScript DOM API ทำงานได้ดีบนเบราว์เซอร์ที่ทันสมัย
Wojtek Kruszewski

2
@ WojtekKruszewski ไม่ใช่ในปี 2010 :) ฉันได้อัปเดตหวังว่าผู้ถามจะย้ายการยอมรับให้เรา - เราต้องการข้อมูลปัจจุบันที่นั่น
Nick Craver

1
ฉันคิดว่า jQuery (หรือเทียบเท่า) อาจเป็นวิธีที่ง่ายที่สุดโดยเฉพาะอย่างยิ่งที่จะใช้งานร่วมกับเบราว์เซอร์ข้ามได้โดยไม่ต้องรู้ว่าต้องใช้อะไร
Alexis Wilke

1
ฉันได้รับอาเรย์ที่ว่างเปล่าต่อไป! ฉันพยายามคว้า SVG โดยใช้แอตทริบิวต์ d และพยายาม $ ("[d = path]"); โดยที่ 'path' เป็นตัวแปรที่มี d-attribute เฉพาะที่ฉันต้องการ มีใครลองทำเช่นนี้กับเส้นทาง svg?
tx291

439

เบราว์เซอร์สมัยใหม่รองรับ Native querySelectorAllเพื่อให้คุณสามารถ:

document.querySelectorAll('[data-foo="value"]');

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

รายละเอียดเกี่ยวกับความเข้ากันได้ของเบราว์เซอร์:

คุณสามารถใช้ jQuery เพื่อรองรับเบราว์เซอร์ที่ล้าสมัย (IE9 ขึ้นไป):

$('[data-foo="value"]');

2
เพื่อสรุปคำนิยาม "ทันสมัย": caniuse.com/#search=querySelectorAll
serhio

ดูเหมือนว่าค่าไม่สามารถเป็นตัวเลขหรือSyntaxError: An invalid or illegal string was specified
jeum

3
ตัวเลือกควรเป็น:'[data-foo="value"]'
Yotam Omer

1
บันทึกใด ๆ เกี่ยวกับความสมบูรณ์? มันเร็วกว่าการทำซ้ำโหนดทั้งหมดหรือไม่
Stepan Yakovenko

1
"data-foo" คืออะไร ... และ 'myAttribute' หายไปไหนในตัวอย่างนี้
oo_dev

38

เราสามารถใช้ตัวเลือกคุณสมบัติใน DOM โดยใช้document.querySelector()และdocument.querySelectorAll()วิธีการ

สำหรับคุณ:

document.querySelector("selector[myAttribute='aValue']");

และโดยการใช้querySlectorAll():

document.querySelectorAll("selector[myAttribute='aValue']");

ในquerySelector()และquerySelectorAll()วิธีการที่เราสามารถเลือกวัตถุที่เราเลือกใน "CSS"

เพิ่มเติมเกี่ยวกับตัวเลือกแอตทริบิวต์ "CSS" ในhttps://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors


ฉันต้องลบเครื่องหมายอัญประกาศด้านในเช่น document.querySelectorAll ("selector [myAttribute = aValue]");
Matjaz Hirsman

20
FindByAttributeValue("Attribute-Name", "Attribute-Value");   

ป.ล. ถ้าคุณรู้องค์ประกอบประเภทที่แน่นอนคุณเพิ่มพารามิเตอร์ตัวที่ 3 (เช่นdiv, a, p ...etc...):

FindByAttributeValue("Attribute-Name", "Attribute-Value", "div");   

แต่ในตอนแรกให้นิยามฟังก์ชั่นนี้:

function FindByAttributeValue(attribute, value, element_type)    {
  element_type = element_type || "*";
  var All = document.getElementsByTagName(element_type);
  for (var i = 0; i < All.length; i++)       {
    if (All[i].getAttribute(attribute) == value) { return All[i]; }
  }
}

ปรับปรุง PS ตามคำแนะนำความคิดเห็น


6
ทำไมล่ะ! คุณวนลูป DOM ทั้งหมดของคุณโดยทำสิ่งนี้
Arthur

3
สิ่งนี้ดูดีมาก - ถ้าคุณมีเพียง 5 องค์ประกอบในหน้า
sheriffderek

2
document.querySelectorAll('[data-foo="value"]');ตามที่เสนอโดย @Wojtek Kruszewski บน awnser ที่ยอมรับแล้ว
อาร์เธอร์

7

นี่คือตัวอย่างวิธีค้นหารูปภาพในเอกสารโดย src attribute:

document.querySelectorAll("img[src='https://pbs.twimg.com/profile_images/........jpg']");

6

คุณสามารถใช้ getAttribute:

 var p = document.getElementById("p");
 var alignP = p.getAttribute("align");

https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute


2
เขาต้องการที่จะเลือกpองค์ประกอบโดยไม่ต้องใช้idหรือทุกอย่างpใน DOM (และแอตทริบิวต์การทดสอบ)
Arthur

0

ใช้ตัวเลือกคิวรีตัวอย่าง:

document.querySelectorAll(' input[name], [id|=view], [class~=button] ')

input[name]องค์ประกอบอินพุตพร้อมnameคุณสมบัติ

[id|=view]view-องค์ประกอบที่มีรหัสที่ขึ้นต้นด้วย

[class~=button]องค์ประกอบกับbuttonคลาส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.