Bagaimana Cara Mendapatkan Elemen Menurut Kelas dalam JavaScript?

226

Saya ingin mengganti konten di dalam elemen html jadi saya menggunakan fungsi berikut untuk itu:

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

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

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

Di atas berfungsi dengan baik tetapi masalahnya adalah saya memiliki lebih dari satu elemen html pada halaman yang ingin saya ganti konten. Jadi saya tidak bisa menggunakan id tetapi kelas. Saya telah diberitahu bahwa javascript tidak mendukung semua jenis elemen inbuilt get oleh fungsi kelas. Jadi bagaimana kode di atas dapat direvisi agar berfungsi dengan kelas, bukan id?

PS Saya tidak ingin menggunakan jQuery untuk ini.

Taylor
sumber

Jawaban:

198

Kode ini harus bekerja di semua browser.

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

Cara kerjanya adalah dengan mengulang-ulang semua elemen dalam dokumen, dan mencari daftar kelas mereka matchClass. Jika kecocokan ditemukan, isinya diganti.

Contoh jsFiddle, menggunakan Vanilla JS (yaitu tidak ada kerangka kerja)

Randy the Dev
sumber
5
+1 - Tangkapan yang bagus dengan spasi, saya selalu lupa untuk melakukan itu ... akan mencuri itu untuk jawaban saya;) kelas adalah kata khusus dalam javascript; Anda tidak boleh menggunakannya untuk nama variabel meskipun sebenarnya tidak ada salahnya (belum).
Dagg Nabbit
1
@tidak dengan fungsi itu Anda tidak harus memiliki konten apa pun di dalam elemen yang ingin Anda ganti. Anda dapat memiliki string di sana atau Anda dapat membuatnya kosong. Either way teks pengganti akan tiba-tiba muncul di sana ketika fungsi dipanggil.
Taylor
4
Andrew, @tidak - Menggunakan classsebagai nama variabel tidak berfungsi di Safari, sehingga saat ini berdampak.
user113716
4
Array yang dikembalikan oleh getElementsBytagName juga memiliki properti panjang, di mana tes className / indexOf kemudian dilakukan juga. Meskipun ini bukan masalah dalam kasus ini, regular untuk loop akan lebih tepat.
Wolfgang Stengel
1
alih-alih indexOf dengan spasi, menyimpan elems[i].className, mengatakan, var cndan menggunakan cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))akan bekerja lebih baik karena cocok dengan spasi putih (spasi, ruang non-breaking, tab, dll.) sementara juga memungkinkan nama kelas pertama / terakhir dicocokkan. Contoh: jsfiddle.net/AXdtH/1636
Supuhstar
178

Tentu saja, semua browser modern sekarang mendukung cara yang lebih sederhana berikut:

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

tetapi berhati-hatilah itu tidak bekerja dengan IE8 atau sebelumnya. Lihat http://caniuse.com/getelementsbyclassname

Juga, tidak semua browser akan mengembalikan yang murni NodeList seperti seharusnya.

Anda mungkin masih lebih baik menggunakan perpustakaan lintas-browser favorit Anda.

Dingin
sumber
Untuk IE8 dapat Anda gunakan querySelectorAll.
Gras Double
109
document.querySelectorAll(".your_class_name_here");

Itu akan bekerja di browser "modern" yang menerapkan metode itu (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");

Jika Anda ingin memberikan dukungan untuk browser lama, Anda dapat memuat mesin pemilih yang berdiri sendiri seperti Sizzle (mini 4KB + gzip) atau Peppy (mini 10K) dan kembali ke sana jika metode kueri pemilih asli tidak ditemukan.

Apakah terlalu berat memuat mesin pemilih supaya Anda bisa mendapatkan elemen dengan kelas tertentu? Mungkin. Namun, skrip tidak terlalu besar dan Anda akan menemukan mesin pemilih berguna di banyak tempat lain di skrip Anda.

Cristian Sanchez
sumber
@Aylor: Saya pikir itu bekerja di IE8 (tidak 100% yakin - terlalu malas untuk google). Apapun, saya menambahkan beberapa info tentang kompatibilitas mundur menggunakan mesin pemilih pihak ketiga.
Cristian Sanchez
18
document.querySelectorbekerja di IE8 dan di atasnya: caniuse.com/queryselector
Zeke
26

Cara sederhana dan mudah

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';
}
kta
sumber
6

Saya terkejut tidak ada jawaban menggunakan Ekspresi Reguler. Ini cukup banyak jawaban Andrew , menggunakan RegExp.testbukan String.indexOf, karena tampaknya berkinerja lebih baik untuk beberapa operasi, menurut tes jsPerf .
Tampaknya juga didukung pada 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.");

Jika Anda sering mencari kelas yang sama, Anda dapat lebih meningkatkannya dengan menyimpan ekspresi reguler (dikompilasi) di tempat lain, dan meneruskannya langsung ke fungsi, alih-alih string.

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.");
afsantos
sumber
4

Ini harus berfungsi di hampir semua browser ...

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;
}

Anda harus dapat menggunakannya seperti ini:

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

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

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

Roger Causto
sumber
4
Itu bukan jawaban. Coba jelaskan kode Anda . Selain itu, pada dasarnya ini adalah versi yang lebih ringkas dari jawaban lain untuk pertanyaan ini yang telah diposting 5 tahun yang lalu.
helmbert
Saya tidak tahu apa masalahnya. Jawaban ini ok. Tidak ada komentar ... dan apa? Ini bukan aturan emas. Dan apa yang ingin Anda komentari di sini? Dan apakah itu kode yang dapat dibaca?
AntiCZ
3

Saya menganggap ini bukan opsi yang valid ketika ini awalnya diminta, tetapi Anda sekarang dapat menggunakan document.getElementsByClassName('');. Sebagai contoh:

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

Lihat dokumentasi MDN untuk lebih lanjut.

thornjad
sumber
0

Saya pikir sesuatu seperti:

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;
    }
}
}

akan bekerja

KeatsKelleher
sumber
1
jika Anda hanya memiliki sedikit elemen di halaman Anda, jika tidak ini adalah solusi O (N)
jwl
getAttribute ('class') tampaknya berfungsi di semua kecuali IE, kemudian getAttribute ('className') berfungsi di IE
KeatsKelleher
0

jQuery menangani ini dengan mudah.

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

Ini mengubah semua elemen .myclass ke teks itu.

Daniel Høifødt
sumber
PS: pertanyaannya mengatakan ". Saya tidak ingin menggunakan jQuery untuk ini."
Julian
Ok, saya tidak melihat itu.
Daniel Høifødt
-15

Ketika beberapa elemen kekurangan ID, saya menggunakan jQuery seperti ini:

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

Ini mungkin solusi yang aneh, tetapi mungkin seseorang merasa berguna.

Krotek
sumber
3
Jika ada beberapa elemen dengan kelas myclass, semuanya akan mendapatkan id myid, tetapi id harus unik! Selain itu, OP secara eksplisit mengatakan untuk menghindari jQuery.
Oriol
1
Tidak sulit untuk menambahkan klausa dan kenaikan ID foreach (), jika Anda memiliki beberapa elemen dari kelas yang sama. Saya menambahkan solusi ini sebagai alternatif bagi mereka yang dapat menggunakan jQuery. OP sudah mendapat banyak jawaban yang cocok :-)
The Krotek