querySelector องค์ประกอบสัญลักษณ์แทนตรงกันหรือไม่


133

มีวิธีในการจับคู่องค์ประกอบชื่อตัวแทนโดยใช้querySelectorหรือquerySelectorAllไม่ ฉันเห็นการสนับสนุนสัญลักษณ์แทนในแบบสอบถามแอททริบิว แต่ไม่ใช่สำหรับองค์ประกอบเอง

เอกสาร XML ที่ฉันพยายามวิเคราะห์นั้นเป็นรายการคุณสมบัติโดยทั่วไปและฉันต้องการค้นหาองค์ประกอบที่มีสตริงบางอย่างในชื่อของพวกเขา

ฉันรู้ว่าเอกสาร XML น่าจะต้องมีการปรับโครงสร้างหากฉันต้องการสิ่งนี้ แต่นั่นก็ไม่ได้เกิดขึ้น

วิธีการแก้ปัญหาใด ๆ ยกเว้นกลับไปใช้ XPath ที่เห็นได้ชัดว่าเลิก (IE9 ลดลง) เป็นที่ยอมรับ


โดย "name" คุณหมายถึงชื่อแท็กใช่หรือไม่
kennytm

1
@ คำตอบของ JaredMcAteer นั้นคุ้มค่ามากที่จะได้รับคำตอบว่าเป็นคำตอบ โปรดพิจารณา.
RBT

คำตอบ:


347

[id^='someId']someIdจะตรงกับรหัสทั้งหมดที่เริ่มต้นด้วย

[id$='someId']someIdจะตรงกับรหัสทั้งหมดที่ลงท้ายด้วย

[id*='someId']someIdจะตรงกับรหัสทั้งหมดที่มี

หากคุณกำลังมองหาnameแอตทริบิวต์เพียงทดแทนด้วยidname

หากคุณกำลังพูดถึงชื่อแท็กขององค์ประกอบฉันไม่เชื่อว่ามีวิธีการใช้ querySelector


4
ขอบคุณฉันหมายถึงชื่อแท็ก
Erik Andersson

อืมฉันไม่สามารถทำเอกสารได้
QuerySelectorAll

4
ช่วงเวลาที่มีการสับสนอาจเกิดขึ้นกับdocument.querySelectorAll("div[id$='foo']")IE8 เท่านั้นที่รองรับ QSA เพียงบางส่วนฉันคิดว่าพวกเขารองรับ CSS2.1 selectors ดังนั้นตัวเลือกเหล่านี้จะไม่ทำงานใน IE8 แต่ IE9 + จะใช้งานได้
JaredMcAteer

คำตอบนี้ช่วยชีวิตฉันไว้! ขอบคุณ!!
Menas

28

ฉันกำลังสับสน / ครุ่นคิดเกี่ยวกับ one-liners ที่เกี่ยวข้องกับ querySelector () และจบลงที่นี่และมีคำตอบที่เป็นไปได้สำหรับคำถาม OP โดยใช้ชื่อแท็ก & querySelector () โดยให้เครดิตกับ @JaredMcAteer สำหรับตอบคำถามของฉัน จับคู่กับ querySelector () ในวานิลลา Javascript

การหวังว่าสิ่งต่อไปนี้จะเป็นประโยชน์และสอดคล้องกับความต้องการของ OP หรือคนอื่น ๆ :

// basically, of before:
var youtubeDiv = document.querySelector('iframe[src="http://www.youtube.com/embed/Jk5lTqQzoKA"]')

// after     
var youtubeDiv = document.querySelector('iframe[src^="http://www.youtube.com"]');
// or even, for my needs
var youtubeDiv = document.querySelector('iframe[src*="youtube"]');

จากนั้นเราสามารถรับ src stuff, etc ...

console.log(youtubeDiv.src);
//> "http://www.youtube.com/embed/Jk5lTqQzoKA"
console.debug(youtubeDiv);
//> (...)

12

ตั้ง tagName เป็นแอตทริบิวต์ที่ชัดเจน:

for(var i=0,els=document.querySelectorAll('*'); i<els.length;
          els[i].setAttribute('tagName',els[i++].tagName) );

ฉันต้องการสิ่งนี้ด้วยตนเองสำหรับเอกสาร XML โดยที่แท็กที่ซ้อนกันลงท้าย_Sequenceด้วย ดูJaredMcAteerคำตอบสำหรับรายละเอียดเพิ่มเติม

document.querySelectorAll('[tagName$="_Sequence"]')

ฉันไม่ได้บอกว่ามันจะสวย :) PS: ฉันอยากจะแนะนำให้ใช้tag_nameมากกว่า tagName ดังนั้นคุณจึงไม่ต้องเจอกับการรบกวนเมื่ออ่าน 'คอมพิวเตอร์สร้างขึ้น' โดยปริยายแอตทริบิวต์ DOM


8

ฉันเพิ่งเขียนสคริปต์สั้น ๆ นี้ ดูเหมือนว่าจะทำงาน

/**
 * Find all the elements with a tagName that matches.
 * @param {RegExp} regEx  regular expression to match against tagName
 * @returns {Array}       elements in the DOM that match
 */
function getAllTagMatches(regEx) {
  return Array.prototype.slice.call(document.querySelectorAll('*')).filter(function (el) { 
    return el.tagName.match(regEx);
  });
}
getAllTagMatches(/^di/i); // Returns an array of all elements that begin with "di", eg "div"

วัตถุที่ส่งคืนโดย querySelectorAll ไม่จำเป็นต้องรองรับตัวกรองในทุกเบราว์เซอร์ (เนื่องจากไม่ใช่อาร์เรย์ของจาวาสคริปต์ปกติ) ตรวจสอบให้แน่ใจเพื่อตรวจสอบการยืนยันนี้ในการผลิตก่อนที่สคริปต์จะถูกสร้างขึ้น (ถ้าสคริปต์ถูกสร้างแบบไดนามิก) หรือใช้คำสั่งเงื่อนไข
Dmitry

คำตอบที่ดีมาก ... นี่คือการแข่งขันปิดที่ฉันพบกับปัญหาของฉัน ฉันทำงานกับองค์ประกอบที่กำหนดเองและคุณสมบัติเช่นนี้ยังคงทำงานด้วยตนเองเศร้า
codepleb

-1

มีวิธีหนึ่งในการพูดในสิ่งที่ไม่เป็น เพียงทำสิ่งที่มันไม่เคยจะเป็น การอ้างอิงตัวเลือก css ที่ดี: https://www.w3schools.com/cssref/css_selectors.aspซึ่งแสดงให้เห็นถึง: ไม่เลือกดังนี้:

:not(selector)  :not(p) Selects every element that is not a <p> element

นี่คือตัวอย่าง: div ตามด้วยบางสิ่ง (ยกเว้นแท็ก az)

div > :not(z){
 border:1px solid pink;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.