Come ottenere elementi per classe in JavaScript?


226

Voglio sostituire il contenuto all'interno di un elemento html, quindi sto usando la seguente funzione per quello:

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

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

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

Quanto sopra funziona alla grande, ma il problema è che ho più di un elemento html in una pagina di cui voglio sostituire il contenuto. Quindi non posso usare ID ma classi invece. Mi è stato detto che javascript non supporta alcun tipo di elemento get incorporato per funzione di classe. Quindi, come può essere rivisto il codice sopra per farlo funzionare con le classi anziché con gli ID?

PS Non voglio usare jQuery per questo.

Risposte:


198

Questo codice dovrebbe funzionare in tutti i 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;
        }
    }
}

Il modo in cui funziona è scorrere ciclicamente tutti gli elementi nel documento e cercare l'elenco delle classi matchClass. Se viene trovata una corrispondenza, il contenuto viene sostituito.

Esempio jsFiddle, usando Vanilla JS (cioè nessun framework)


5
+1 - Buona cattura con gli spazi, mi dimentico sempre di farlo ... andando a rubarlo per la mia risposta;) la classe è una parola riservata in javascript; non dovresti usarlo per un nome di variabile anche se in realtà non fa ancora del male.
Dagg Nabbit,

1
@no con quella funzione non devi avere alcun contenuto all'interno dell'elemento che vuoi sostituire. Puoi avere una stringa lì dentro o puoi averla vuota. In ogni caso, il testo sostitutivo apparirà improvvisamente lì quando viene chiamata la funzione.
Taylor,

4
Andrew, @no - L'uso classcome nome di variabile non funziona in Safari, quindi attualmente ha un impatto.
user113716,

4
L'array restituito da getElementsBytagName ha anche una proprietà length, per la quale viene quindi eseguito anche il test className / indexOf. Anche se questo non è un problema in questo caso, un ciclo for regolare sarebbe più corretto.
Wolfgang Stengel,

1
invece di indexOf con spazi, il salvataggio elems[i].classNamein, dire var cne l'uso cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))funzionerebbe meglio perché si adatta a qualsiasi spazio bianco (spazio, spazio non-break, tab, ecc.) consentendo allo stesso tempo di far corrispondere i nomi della prima / ultima classe. Esempio: jsfiddle.net/AXdtH/1636
Supuhstar

178

Ovviamente, tutti i browser moderni ora supportano il seguente modo più semplice:

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

ma attenzione, non funziona con IE8 o prima. Vedi http://caniuse.com/getelementsbyclassname

Inoltre, non tutti i browser restituiranno un valore puro NodeListcome dovrebbero.

Probabilmente stai ancora meglio usando la tua libreria preferita tra browser.


Per IE8 è possibile utilizzare querySelectorAll.
Gras Double,

109
document.querySelectorAll(".your_class_name_here");

Funzionerà con i browser "moderni" che implementano quel metodo (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");

Se si desidera fornire supporto per browser meno recenti, è possibile caricare un motore di selezione autonomo come Sizzle (4KB mini + gzip) o Peppy (10K mini) e ricorrere ad esso se non viene trovato il metodo querySelector nativo.

È eccessivo caricare un motore di selezione in modo da poter ottenere elementi con una determinata classe? Probabilmente. Tuttavia, gli script non sono poi così grandi e potresti trovare il motore di selezione utile in molti altri punti del tuo script.


@Taylor: penso che funzioni in IE8 (non sicuro al 100% - troppo pigro per cercarlo su Google). Indipendentemente da ciò, ho aggiunto alcune informazioni sulla compatibilità con le versioni precedenti utilizzando motori di selezione di terze parti.
Cristian Sanchez,

18
document.querySelectorfunziona in IE8 e versioni successive: caniuse.com/queryselector
Zeke

26

Un modo semplice e facile

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

Sono sorpreso che non ci siano risposte usando le espressioni regolari. Questa è praticamente la risposta di Andrew , usando RegExp.testinvece di String.indexOf, dal momento che sembra funzionare meglio per più operazioni, secondo i test jsPerf .
Sembra anche essere supportato su 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.");

Se cerchi frequentemente le stesse classi, puoi migliorarla ulteriormente memorizzando le espressioni regolari (precompilate) altrove e passandole direttamente alla funzione, anziché una stringa.

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

Questo dovrebbe funzionare praticamente in qualsiasi 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;
}

Dovresti essere in grado di usarlo in questo modo:

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
Non è proprio una risposta. Prova a spiegare il tuo codice . Inoltre, è sostanzialmente una versione più compatta di un'altra risposta a questa domanda che è stata pubblicata 5 anni fa.
helmbert,

Non so quale sia il problema. Questa risposta è ok Non ci sono commenti ... e cosa? Questa non è la regola d'oro. E cosa vuoi commentare qui? E ma è un codice leggibile?
AntiCZ,

3

Presumo che questa non fosse un'opzione valida quando questo è stato originariamente richiesto, ma ora è possibile utilizzare document.getElementsByClassName('');. Per esempio:

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

Vedere la documentazione MDN per ulteriori informazioni.


0

Penso a qualcosa del tipo:

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

funzionerebbe


1
se hai solo una manciata di elementi nella tua pagina, altrimenti questa è la soluzione O (N)
jwl,

getAttribute ('class') sembra funzionare in tutti tranne IE, quindi getAttribute ('className') funziona in IE
KeatsKelleher,

0

jQuery gestisce questo facile.

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

Cambia tutti gli elementi .myclass in quel testo.


PS: la domanda dice ". Non voglio usare jQuery per questo."
Julian

Ok, non l'ho visto.
Daniel Høifødt,

-15

Quando alcuni elementi mancano di ID, utilizzo jQuery in questo modo:

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

Questa potrebbe essere una strana soluzione, ma forse qualcuno lo trova utile.


3
Se ci sono più elementi con classe myclass, tutti otterranno l'id myid, ma gli id ​​dovrebbero essere unici! Inoltre, OP dice esplicitamente di evitare jQuery.
Oriol,

1
Non è difficile aggiungere una clausola foreach () e un ID di incremento, se si hanno più elementi della stessa classe. Ho aggiunto questa soluzione come alternativa per coloro che possono usare jQuery. OP ha già ricevuto un sacco di risposte adeguate comunque :-)
Il Krotek il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.