Wie bekomme ich Element nach Klasse in JavaScript?
Lesezeit: 5 Minuten
Taylor
Ich möchte den Inhalt in einem HTML-Element ersetzen, also verwende ich dafür die folgende Funktion:
function ReplaceContentInContainer(id,content) {
var container = document.getElementById(id);
container.innerHTML = content;
}
ReplaceContentInContainer('box','This is the replacement text');
<div id='box'></div>
Das obige funktioniert großartig, aber das Problem ist, dass ich mehr als ein HTML-Element auf einer Seite habe, deren Inhalt ich ersetzen möchte. Ich kann also keine IDs, sondern Klassen verwenden. Mir wurde gesagt, dass Javascript keine Art von eingebautem Get-Element nach Klassenfunktion unterstützt. Wie kann also der obige Code überarbeitet werden, damit er mit Klassen statt mit IDs funktioniert?
PS Ich möchte jQuery dafür nicht verwenden.
Randy der Entwickler
Dieser Code sollte in allen Browsern funktionieren.
function replaceContentInContainer(matchClass, content) {
var elems = document.getElementsByTagName('*'), i;
for (i in elems) {
if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
> -1) {
elems[i].innerHTML = content;
}
}
}
Die Funktionsweise besteht darin, alle Elemente im Dokument zu durchlaufen und deren Klassenliste zu durchsuchen matchClass. Wenn eine Übereinstimmung gefunden wird, wird der Inhalt ersetzt.
+1 – Guter Fang mit den Leerzeichen, das vergesse ich immer … werde das für meine Antwort stehlen;) Klasse ist jedoch ein reserviertes Wort in Javascript; Sie sollten es nicht für einen Variablennamen verwenden, obwohl es (noch) nicht wirklich schadet.
– Dagg Nabbit
28. September 2010 um 0:36 Uhr
@no mit dieser Funktion müssen Sie keinen Inhalt in dem Element haben, das Sie ersetzen möchten. Sie können eine Zeichenfolge darin haben oder Sie können sie leer haben. In jedem Fall erscheint dort plötzlich der Ersetzungstext, wenn die Funktion aufgerufen wird.
– Taylor
28. September 2010 um 0:47 Uhr
Andrew, @no – Verwenden class da ein Variablenname in Safari nicht funktioniert, hat er derzeit Auswirkungen.
– Benutzer113716
28. September 2010 um 0:50 Uhr
Das von getElementsBytagName zurückgegebene Array hat auch eine length-Eigenschaft, für die dann auch der className/indexOf-Test durchgeführt wird. Obwohl dies in diesem Fall kein Problem darstellt, wäre eine reguläre for-Schleife korrekter.
– Wolfgang Stengel
6. März 2013 um 15:56 Uhr
statt indexOf mit Leerzeichen speichern elems[i].className hinein, sagen wir var cn und verwenden cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)")) würde besser funktionieren, da es mit jedem Leerzeichen (Leerzeichen, geschütztes Leerzeichen, Tabulatoren usw.) übereinstimmt und gleichzeitig die Übereinstimmung mit den ersten/letzten Klassennamen ermöglicht. Beispiel: jsfiddle.net/AXdtH/1636
– Ky.
30. November 2014 um 23:49 Uhr
Kalt kalt
Natürlich unterstützen alle modernen Browser jetzt den folgenden einfacheren Weg:
var elements = document.getElementsByClassName('someClass');
Das funktioniert in “modernen” Browsern, die diese Methode implementieren (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");
Wenn Sie Unterstützung für ältere Browser bereitstellen möchten, können Sie eine eigenständige Auswahl-Engine wie laden Brutzeln (4KB mini+gzip) oder Schwungvoll (10K mini) und greifen darauf zurück, wenn die native querySelector-Methode nicht gefunden wird.
Ist es übertrieben, eine Selektor-Engine zu laden, nur um Elemente mit einer bestimmten Klasse zu erhalten? Wahrscheinlich. Die Skripte sind jedoch nicht allzu groß, und Sie werden die Selektor-Engine möglicherweise an vielen anderen Stellen in Ihrem Skript nützlich finden.
@Taylor: Ich denke, es funktioniert in IE8 (nicht 100% sicher – zu faul, um es zu googeln). Unabhängig davon habe ich einige Informationen zur Abwärtskompatibilität mit Selektor-Engines von Drittanbietern hinzugefügt.
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';
}
Afsantos
Ich bin überrascht, dass es keine Antworten mit regulären Ausdrücken gibt. Das ist so ziemlich Andrews Antwort, using RegExp.test anstatt String.indexOfda es laut scheint, für mehrere Operationen besser zu funktionieren jsPerf-Tests.
Es auch scheint auf IE6 unterstützt zu werden.
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.");
Wenn Sie häufig nach denselben Klassen suchen, können Sie sie weiter verbessern, indem Sie die (vorkompilierten) regulären Ausdrücke an anderer Stelle speichern und sie anstelle eines Strings direkt an die Funktion übergeben.
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.");
Das sollte in so ziemlich jedem Browser funktionieren…
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;
}
Sie sollten es wie folgt verwenden können:
function replaceInClass (className, content) {
var nodes = getByClass(className), i=-1, node;
while (node=nodes[++i]) node.innerHTML = content;
}
var elems = document.querySelectorAll('.one');
for (var i = 0; i < elems.length; i++) {
elems[i].innerHTML = 'content';
};
Das ist nicht wirklich eine Antwort. Bitte versuche zu erklär mal deinen Code. Darüber hinaus ist es im Grunde eine kompaktere Version einer anderen Antwort auf diese Frage, die vor 5 Jahren veröffentlicht wurde.
– Helmbert
12. Mai 2015 um 15:45 Uhr
Ich weiß nicht, was das Problem ist. Diese Antwort ist in Ordnung. Es gibt keinen Kommentar … und was? Das ist keine Goldregel. Und was willst du hier kommentieren? Und Aber ist es lesbarer Code?
– AntiCZ
23. Juli 2015 um 10:56 Uhr
10023500cookie-checkWie bekomme ich Element nach Klasse in JavaScript?yes