3379 Stimmen

Wie kann ich die Klasse eines Elements mit JavaScript ändern?

Wie kann ich die Klasse eines HTML-Elements als Reaktion auf eine onclick oder andere Ereignisse mit JavaScript?

32 Stimmen

"Das class-Attribut wird meist verwendet, um auf eine Klasse in einem Stylesheet zu verweisen. Es kann jedoch auch von einem JavaScript (über das HTML-DOM) verwendet werden, um Änderungen an HTML-Elementen mit einer bestimmten Klasse vorzunehmen." - w3schools.com/tags/att_standard_class.asp

24 Stimmen

element.setAttribute(name, value); Ersetzen Sie name con class . Ersetzen Sie value mit dem Namen, den Sie der Klasse gegeben haben, eingeschlossen in Anführungszeichen. Dadurch wird vermieden, dass Sie die aktuelle Klasse löschen und eine andere hinzufügen müssen. Dies jsFiddle-Beispiel zeigt einen vollständig funktionierenden Code.

4 Stimmen

Um eine Klasse eines HTML-Elements mit onClick zu ändern, verwenden Sie diesen Code: <input type='button' onclick='addNewClass(this)' value='Create' /> und im Abschnitt javascript: function addNewClass(elem){ elem.className="newClass"; } Online

4570voto

Peter Boughton Punkte 105921

Moderne HTML5-Techniken für den Klassenwechsel

Moderne Browser haben die classList die Methoden zur Verfügung stellt, die es einfacher machen, Klassen zu manipulieren, ohne eine Bibliothek zu benötigen:

document.getElementById("MyElement").classList.add('MyClass');

document.getElementById("MyElement").classList.remove('MyClass');

if ( document.getElementById("MyElement").classList.contains('MyClass') )

document.getElementById("MyElement").classList.toggle('MyClass');

Leider funktionieren diese nicht im Internet Explorer vor v10, obwohl es eine Unterlegscheibe um die Unterstützung für IE8 und IE9 hinzuzufügen, erhältlich bei diese Seite . Es wird jedoch immer mehr zu einer unterstützt .

Einfache Cross-Browser-Lösung

Die Standard-JavaScript-Methode zur Auswahl eines Elements ist die Verwendung von document.getElementById("Id") Sie können die Elemente natürlich auch auf andere Weise erhalten, und in der richtigen Situation können Sie einfach this Dies würde jedoch den Rahmen dieser Antwort sprengen, da sie nicht im Detail darauf eingeht.

Um alle Klassen für ein Element zu ändern:

Um alle vorhandenen Klassen durch eine oder mehrere neue Klassen zu ersetzen, setzen Sie das Attribut className:

document.getElementById("MyElement").className = "MyClass";

(Sie können eine durch Leerzeichen getrennte Liste verwenden, um mehrere Klassen anzuwenden).

So fügen Sie einem Element eine zusätzliche Klasse hinzu:

Um eine Klasse zu einem Element hinzuzufügen, ohne bestehende Werte zu entfernen/beeinflussen, fügen Sie ein Leerzeichen und den neuen Klassennamen an, etwa so:

document.getElementById("MyElement").className += " MyClass";

So entfernen Sie eine Klasse aus einem Element:

Um eine einzelne Klasse aus einem Element zu entfernen, ohne andere potenzielle Klassen zu beeinträchtigen, ist eine einfache Regex-Ersetzung erforderlich:

document.getElementById("MyElement").className =
   document.getElementById("MyElement").className.replace
      ( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */

Eine Erklärung dieser Regex ist wie folgt:

(?:^|\s) # Match the start of the string or any single whitespace character

MyClass  # The literal text for the classname to remove

(?!\S)   # Negative lookahead to verify the above is the whole classname
         # Ensures there is no non-space character following
         # (i.e. must be the end of the string or space)

Le site g weist den Ersetzer an, bei Bedarf zu wiederholen, falls der Klassenname mehrfach hinzugefügt wurde.

Um zu prüfen, ob eine Klasse bereits auf ein Element angewendet wird:

Dieselbe Regex, die oben zum Entfernen einer Klasse verwendet wurde, kann auch zur Prüfung verwendet werden, ob eine bestimmte Klasse existiert:

if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )

### Zuweisung dieser Aktionen zu Onclick-Ereignissen:

Es ist zwar möglich, JavaScript direkt in die HTML-Ereignisattribute zu schreiben (z. B. onclick="this.className+=' MyClass'" ) ist dieses Verhalten nicht empfehlenswert. Vor allem bei größeren Anwendungen wird durch die Trennung von HTML-Markup und JavaScript-Interaktionslogik ein besser wartbarer Code erreicht.

Der erste Schritt, um dies zu erreichen, ist die Erstellung einer Funktion und der Aufruf der Funktion im onclick-Attribut, zum Beispiel:

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }
</script>
...
<button onclick="changeClass()">My Button</button>

<em>(Es ist nicht erforderlich, diesen Code in Skript-Tags einzubinden; dies dient lediglich der Kürze des Beispiels, und es kann sinnvoller sein, das JavaScript in eine eigene Datei aufzunehmen).</em>

Der zweite Schritt besteht darin, das Onclick-Ereignis aus dem HTML-Code in JavaScript zu verschieben, zum Beispiel mit addEventListener

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }

    window.onload = function(){
        document.getElementById("MyElement").addEventListener( 'click', changeClass);
    }
</script>
...
<button id="MyElement">My Button</button>

(Beachten Sie, dass der Teil window.onload erforderlich ist, damit der Inhalt dieser Funktion ausgeführt wird après der HTML-Ladevorgang abgeschlossen ist - andernfalls könnte das MyElement nicht existieren, wenn der JavaScript-Code aufgerufen wird, so dass diese Zeile fehlschlagen würde).

JavaScript-Frameworks und -Bibliotheken

Der obige Code ist in Standard-JavaScript, aber es ist üblich, entweder ein Framework oder eine Bibliothek zu verwenden, um häufige Aufgaben zu vereinfachen und von behobenen Fehlern und Randfällen zu profitieren, an die man beim Schreiben des Codes vielleicht nicht denkt.

Während manche Leute es für übertrieben halten, ein ~50 KB großes Framework hinzuzufügen, nur um eine Klasse zu ändern, ist es durchaus eine Überlegung wert, wenn Sie viel mit JavaScript arbeiten oder etwas tun, das ein ungewöhnliches browserübergreifendes Verhalten haben könnte.

(Ganz grob gesagt, ist eine Bibliothek ein Satz von Werkzeugen, die für eine bestimmte Aufgabe entwickelt wurden, während ein Framework im Allgemeinen mehrere Bibliotheken enthält und einen kompletten Satz von Aufgaben erfüllt).

Die obigen Beispiele wurden im Folgenden unter Verwendung folgender Parameter wiedergegeben jQuery , die wahrscheinlich am häufigsten verwendete JavaScript-Bibliothek (obwohl es auch andere gibt, die es wert sind, untersucht zu werden).

(Beachten Sie, dass $ hier ist das jQuery-Objekt).

Ändern von Klassen mit jQuery:

$('#MyElement').addClass('MyClass');

$('#MyElement').removeClass('MyClass');

if ( $('#MyElement').hasClass('MyClass') )

Darüber hinaus bietet jQuery eine Abkürzung für das Hinzufügen einer Klasse, wenn sie nicht zutrifft, oder das Entfernen einer Klasse, die zutrifft:

$('#MyElement').toggleClass('MyClass');

### Zuweisung einer Funktion an ein Klick-Ereignis mit jQuery:

$('#MyElement').click(changeClass);

oder, ohne dass eine ID benötigt wird:

$(':button:contains(My Button)').click(changeClass);

122 Stimmen

Tolle Antwort, Peter. Eine Frage... warum ist es besser mit JQuery zu tun als mit Javascript? JQuery ist großartig, aber wenn dies alles ist, was Sie tun müssen - was rechtfertigt die Einbeziehung der gesamten JQuery-Bibliothek anstelle von ein paar Zeilen von JavaScript?

25 Stimmen

@mattstuehler 1) die Phrase "besser noch x" oft bedeutet "besser noch (Sie können) x". 2) Um auf den Kern der Sache, jQuery ist entworfen, um den Zugriff / Manipulation des DOM zu helfen, und sehr oft, wenn Sie diese Art von Sache einmal tun müssen, müssen Sie es überall tun.

4 Stimmen

Achten Sie darauf, dass im Fall von "Klassenname hinzufügen" vor dem hinzuzufügenden Klassennamen kein Leerzeichen stehen darf.

483voto

Tyilo Punkte 27398

Sie können es auch einfach tun:

document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

Und um eine Klasse umzuschalten (entfernen, wenn vorhanden, sonst hinzufügen):

document.getElementById('id').classList.toggle('class');

70 Stimmen

Ich glaube, das ist HTML5-abhängig.

13 Stimmen

Sie brauchen Eli Grey's classList Unterlegscheibe.

16 Stimmen

Mozilla-Entwickler-Netzwerk besagt, dass es in Internet Explorern kleiner als 10 nicht funktioniert. Bei meinen Tests habe ich festgestellt, dass diese Aussage zutrifft. Anscheinend ist die Eli Grey Passscheibe ist für Internet Explorer 8-9 erforderlich. Leider konnte ich sie auf seiner Website nicht finden (auch nicht mit der Suche). Das Shim ist über den Mozilla-Link verfügbar.

144voto

Andrew Orsich Punkte 51107

In einem meiner alten Projekte, das jQuery nicht verwendet hat, habe ich die folgenden Funktionen zum Hinzufügen, Entfernen und Überprüfen, ob ein Element eine Klasse hat, erstellt:

function hasClass(ele, cls) {
    return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}

function addClass(ele, cls) {
    if (!hasClass(ele, cls))
        ele.className += " " + cls;
}

function removeClass(ele, cls) {
    if (hasClass(ele, cls)) {
        var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
        ele.className = ele.className.replace(reg, ' ');
    }
}

Wenn ich also zum Beispiel onclick um der Schaltfläche eine Klasse hinzuzufügen, kann ich dies verwenden:

<script type="text/javascript">
    function changeClass(btn, cls) {
        if(!hasClass(btn, cls)) {
            addClass(btn, cls);
        }
    }
</script>
...
<button onclick="changeClass(this, "someClass")">My Button</button>

Mittlerweile wäre es sicher besser, einfach jQuery zu verwenden.

10 Stimmen

Dies ist ideal, wenn Ihr Kunde Ihnen die Verwendung von jQuery nicht erlaubt. (Weil Sie am Ende fast Ihre eigene Bibliothek bauen.)

2 Stimmen

@Mike Wenn der Kunde nicht zulässt, dass Sie jQuery verwenden, könnten Sie nicht einfach durchgehen und nur die Funktionen, die Sie in Ihrer eigenen Bibliothek benötigen, nachbauen?

6 Stimmen

@kfrncs Weil ich im Allgemeinen keinen so großen Rahmen brauche. Für das Projekt, an das ich dachte, waren die einzigen Funktionen, die ich brauchte, die 3 classname(has,add,remove) Funktionen und die cookie(has, add, remove) Funktionen. Alles andere war entweder benutzerdefiniert oder wurde von Haus aus gut unterstützt. So war alles zusammen dann nur 150 Zeilen vor dem Minifying, einschließlich Kommentare.

103voto

Eric Wendelin Punkte 40906

Sie können verwenden node.className etwa so:

document.getElementById('foo').className = 'bar';

Dies sollte funktionieren in Internet Explorer 5.5 und nach oben gemäß PPK .

14 Stimmen

Würde dies alle anderen Klassen des Objekts überschreiben... so einfach ist es also nicht.

61voto

Travis J Punkte 78877

Wow, ich bin überrascht, dass es hier so viele übertriebene Antworten gibt...

<div class="firstClass" onclick="this.className='secondClass'">

15 Stimmen

Ich würde sagen, unaufdringliches Javascript ist eine schreckliche Praxis für das Schreiben von Beispielcode...

25 Stimmen

Ich würde dem nicht zustimmen, weil ich denke, dass der Beispielcode ein gutes Beispiel sein sollte.

1 Stimmen

Ein gutes Beispiel sollte lehrreich sein und gleichzeitig die Phantasie anregen. Es sollte das Denken nicht ersetzen, sondern es anregen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X