วิธีรับองค์ประกอบตามคลาสใน JavaScript


226

ฉันต้องการแทนที่เนื้อหาภายในองค์ประกอบ html ดังนั้นฉันจึงใช้ฟังก์ชันต่อไปนี้:

function ReplaceContentInContainer(id,content) {
   var container = document.getElementById(id);
   container.innerHTML = content;
}

ReplaceContentInContainer('box','This is the replacement text');

<div id='box'></div>

ด้านบนใช้งานได้ดี แต่ปัญหาคือฉันมีองค์ประกอบ html มากกว่าหนึ่งรายการในหน้าเว็บที่ฉันต้องการแทนที่เนื้อหาของ ดังนั้นฉันไม่สามารถใช้รหัส แต่เรียนแทน ฉันได้รับการบอกว่าจาวาสคริปต์ไม่สนับสนุนประเภท inbuilt รับองค์ประกอบตามฟังก์ชั่นใด ๆ ดังนั้นรหัสข้างต้นสามารถแก้ไขได้อย่างไรเพื่อให้ทำงานกับคลาสแทนรหัส?

ป.ล. ฉันไม่ต้องการใช้ jQuery สำหรับสิ่งนี้

คำตอบ:


198

รหัสนี้ควรใช้ได้กับทุกเบราว์เซอร์

function replaceContentInContainer(matchClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
                > -1) {
            elems[i].innerHTML = content;
        }
    }
}

matchClassวิธีการทำงานคือการวนลูปผ่านทุกองค์ประกอบในเอกสารและการค้นหารายการระดับของพวกเขาสำหรับ หากพบการแข่งขันเนื้อหาจะถูกแทนที่

ตัวอย่าง jsFiddle โดยใช้ Vanilla JS (เช่นไม่มีกรอบ)


5
+1 - ดีจับกับช่องว่างฉันมักจะลืมที่จะทำอย่างนั้น ... จะขโมยที่สำหรับคำตอบของฉัน;) ชั้นเป็นคำที่สงวนไว้ในจาวาสคริปต์ว่า; คุณไม่ควรใช้มันสำหรับชื่อตัวแปรแม้ว่ามันจะไม่เป็นอันตรายใด ๆ (แต่)
Dagg Nabbit

1
@ ไม่ใช้ฟังก์ชันนั้นคุณไม่จำเป็นต้องมีเนื้อหาใด ๆ ในองค์ประกอบที่คุณต้องการแทนที่ คุณสามารถมีสตริงในนั้นหรือคุณอาจจะว่างเปล่า ไม่ว่าจะด้วยวิธีใดข้อความแทนที่จะปรากฏขึ้นทันทีเมื่อมีการเรียกใช้ฟังก์ชัน
เทย์เลอร์

4
Andrew, @no - การใช้classเป็นชื่อตัวแปรไม่ทำงานใน Safari ดังนั้นขณะนี้จะมีผลกระทบ
user113716

4
อาร์เรย์ที่ส่งคืนโดย getElementsBytagName ยังมีคุณสมบัติความยาวซึ่งการทดสอบ className / indexOf จะถูกดำเนินการเช่นกัน แม้ว่านี่ไม่ใช่ปัญหาในกรณีนี้ปกติสำหรับการวนซ้ำจะถูกต้องมากขึ้น
Wolfgang Stengel

1
แทน indexOf ที่มีช่องว่างการบันทึกการelems[i].classNameพูดvar cnและการใช้cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))งานจะทำงานได้ดีขึ้นเพราะตรงกับช่องว่างใด ๆ (ช่องว่างช่องว่างที่ไม่แบ่งแท็บ ฯลฯ ) ในขณะที่ยังอนุญาตให้จับคู่ชื่อชั้นแรก / ชั้นสุดท้าย ตัวอย่าง: jsfiddle.net/AXdtH/1636
Supuhstar

178

แน่นอนว่าเบราว์เซอร์ที่ทันสมัยทั้งหมดรองรับวิธีที่ง่ายกว่าดังต่อไปนี้:

var elements = document.getElementsByClassName('someClass');

แต่ควรระวังว่ามันจะไม่ทำงานกับ IE8 หรือก่อนหน้านี้ ดูhttp://caniuse.com/getelementsbyclassname

นอกจากนี้เบราว์เซอร์บางตัวจะไม่กลับมาบริสุทธิ์NodeListเหมือนที่ควรจะเป็น

คุณน่าจะยังดีกว่าด้วยการใช้ห้องสมุดข้ามเบราว์เซอร์ที่คุณชื่นชอบ


สำหรับ IE8 querySelectorAllคุณอาจใช้
Gras Double

109
document.querySelectorAll(".your_class_name_here");

ที่จะทำงานในเบราว์เซอร์ "ทันสมัย" ที่ใช้วิธีการนั้น (IE8 +)

function ReplaceContentInContainer(selector, content) {
  var nodeList = document.querySelectorAll(selector);
  for (var i = 0, length = nodeList.length; i < length; i++) {
     nodeList[i].innerHTML = content;
  }
}

ReplaceContentInContainer(".theclass", "HELLO WORLD");

หากคุณต้องการให้การสนับสนุนเบราว์เซอร์รุ่นเก่าคุณสามารถโหลดเครื่องมือตัวเลือกสแตนด์อะโลนเช่นSizzle (4KB mini + gzip) หรือPeppy (10K mini) และถอยกลับไปได้หากไม่พบเมธอด querySelector แบบดั้งเดิม

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


@Taylor: ฉันคิดว่ามันใช้งานได้ใน IE8 (ไม่แน่ใจ 100% - ขี้เกียจเกินไปที่ google) ไม่ว่าฉันจะเพิ่มข้อมูลเกี่ยวกับความเข้ากันได้ย้อนหลังโดยใช้เครื่องมือตัวเลือกของบุคคลที่สาม
Cristian Sanchez

18
document.querySelectorทำงานใน IE8 ขึ้นไป: caniuse.com/queryselector
Zeke

26

วิธีที่ง่ายและสะดวก

var cusid_ele = document.getElementsByClassName('custid');
for (var i = 0; i < cusid_ele.length; ++i) {
    var item = cusid_ele[i];  
    item.innerHTML = 'this is value';
}

6

ฉันประหลาดใจที่ไม่มีคำตอบในการใช้งานนิพจน์ปกติ นี้สวยมากคำตอบที่แอนดรูโดยใช้RegExp.testแทนString.indexOfเพราะมันดูเหมือนว่าจะทำงานได้ดีขึ้นสำหรับการดำเนินงานหลายตามการทดสอบ jsPerf
นอกจากนี้ยังดูเหมือนว่าจะได้รับการสนับสนุนบน IE6

function replaceContentInContainer(matchClass, content) {
    var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"),
        elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (re.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

replaceContentInContainer("box", "This is the replacement text.");

หากคุณค้นหาคลาสเดียวกัน (s) บ่อยครั้งคุณสามารถปรับปรุงได้โดยการเก็บนิพจน์ปกติ (precompiled) ที่อื่นและส่งผ่านไปยังฟังก์ชันโดยตรงแทนที่จะเป็นสตริง

function replaceContentInContainer(reClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (reClass.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

var reBox = /(?:^|\s)box(?!\S)/;
replaceContentInContainer(reBox, "This is the replacement text.");

4

สิ่งนี้น่าจะใช้ได้กับเบราว์เซอร์ใดก็ได้ ...

function getByClass (className, parent) {
  parent || (parent=document);
  var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
  while (e=descendants[++i]) {
    ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
  }
  return result;
}

คุณควรจะใช้มันในลักษณะนี้:

function replaceInClass (className, content) {
  var nodes = getByClass(className), i=-1, node;
  while (node=nodes[++i]) node.innerHTML = content;
}

3

var elems = document.querySelectorAll('.one');

for (var i = 0; i < elems.length; i++) {
    elems[i].innerHTML = 'content';
};


4
นั่นไม่ใช่คำตอบจริงๆ กรุณาพยายามที่จะอธิบายรหัสของคุณ ยิ่งไปกว่านั้นมันเป็นคำตอบที่กระชับกว่าสำหรับคำถามนี้ที่โพสต์เมื่อ 5 ปีที่แล้ว
helmbert

ฉันไม่รู้ว่าปัญหาคืออะไร คำตอบนี้ใช้ได้ ไม่มีความคิดเห็น ... และอะไร นี่ไม่ใช่กฎทอง และสิ่งที่คุณต้องการแสดงความคิดเห็นที่นี่? และแต่มันเป็นรหัสที่อ่านได้?
AntiCZ

3

ฉันคิดว่านี่ไม่ใช่ตัวเลือกที่ถูกต้องเมื่อมีการถามตอนแรก แต่ตอนนี้คุณสามารถdocument.getElementsByClassName('');ใช้ได้ ตัวอย่างเช่น:

var elements = document.getElementsByClassName(names); // or:
var elements = rootElement.getElementsByClassName(names);

ดูเอกสาร MDNสำหรับข้อมูลเพิ่มเติม


0

ฉันคิดว่าชอบ:

function ReplaceContentInContainer(klass,content) {
var elems = document.getElementsByTagName('*');
for (i in elems){
    if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){
        elems[i].innerHTML = content;
    }
}
}

จะทำงาน


1
หากคุณมีองค์ประกอบเพียงไม่กี่รายการในหน้าเว็บของคุณมิฉะนั้นจะเป็นวิธีแก้ปัญหา O (N)
jwl

getAttribute ('class') ดูเหมือนว่าจะทำงานได้ทั้งหมดยกเว้น IE จากนั้น getAttribute ('className') จะทำงานใน IE
KeatsKelleher

0

jQuery จัดการง่ายนี้

let element = $(.myclass);
element.html("Some string");

มันเปลี่ยนองค์ประกอบทั้งหมดของ. myclass เป็นข้อความนั้น


PS: คำถามที่ถามว่า "ฉันไม่ต้องการใช้ jQuery สำหรับสิ่งนี้"
Julian

ตกลงฉันไม่เห็นว่า
Daniel Høifødt

-15

เมื่อองค์ประกอบบางอย่างขาด ID ฉันใช้ jQuery เช่นนี้

$(document).ready(function()
{
    $('.myclass').attr('id', 'myid');
});

นี่อาจเป็นทางออกที่แปลก แต่บางคนอาจพบว่ามีประโยชน์


3
หากมีหลายองค์ประกอบพร้อมคลาสmyclassทั้งหมดจะได้รับ ID myidแต่รหัสควรไม่ซ้ำกัน! ยิ่งไปกว่านั้น OP บอกอย่างชัดเจนว่าควรหลีกเลี่ยง jQuery
Oriol

1
การเพิ่มส่วนคำสั่ง foreach () และ ID ส่วนเพิ่มนั้นไม่ใช่เรื่องยากหากคุณมีองค์ประกอบหลายอย่างในคลาสเดียวกัน ฉันเพิ่มโซลูชันนี้เป็นทางเลือกสำหรับผู้ที่สามารถใช้ jQuery OP มีคำตอบที่เหมาะสมแล้ว :-)
The Krotek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.