Come faccio ad aggiungere una classe a un determinato elemento?


1189

Ho un elemento che ha già una classe:

<div class="someclass">
    <img ... id="image1" name="image1" />
</div>

Ora voglio creare una funzione JavaScript che aggiungerà una classe al div(non sostituire, ma aggiungere).

Come lo posso fare?


9
Per chiunque legga questa discussione nel 2020 o in seguito, salta il vecchio metodo className e usa element.classList.add("my-class")invece.
Pikamander2,

Risposte:


1921

Se stai prendendo di mira solo i browser moderni:

Utilizzare element.classList.add per aggiungere una classe:

element.classList.add("my-class");

E element.classList.remove per rimuovere una classe:

element.classList.remove("my-class");

Se è necessario supportare Internet Explorer 9 o versioni precedenti:

Aggiungi uno spazio più il nome della tua nuova classe alla classNameproprietà dell'elemento. Innanzitutto, inserisci un idelemento in modo da poter ottenere facilmente un riferimento.

<div id="div1" class="someclass">
    <img ... id="image1" name="image1" />
</div>

Poi

var d = document.getElementById("div1");
d.className += " otherclass";

Nota lo spazio prima otherclass. È importante includere lo spazio, altrimenti compromette le classi esistenti che lo precedono nell'elenco delle classi.

Vedi anche element.className su MDN .


26
Se l'unico lavoro sull'intera pagina che deve essere fatto con JavaScript è l'aggiunta di questo nome di classe, allora sì. Ma non riesco a vedere che questa è l'unica parte dinamica della pagina. Una biblioteca aiuterà anche con tutto il resto. A 30-50kb jQuery non è certo un successo da discutere.
rfunduk,

167
"Una biblioteca vi aiuterà con tutto il resto, come pure" - oltre a imparare JavaScript
meouw

19
Cosa c'entra l'aggiunta di una classe a un elemento DOM con l'apprendimento della lingua? document.getElementById ('div1'). className è tanto un problema relativo alla libreria quanto l'utilizzo di jQuery per fare lo stesso. La domanda era "come posso farlo", una libreria accuratamente testata è la risposta ragionevole.
rfunduk,

6
@thenduks: sono sicuro che conosci JavaScript! == jQuery. È una buona cosa che le risposte a questa domanda includano soluzioni di biblioteca e non di biblioteca perché è importante sapere come funzionano le cose non solo il modo più semplice per realizzarle. Noterai che questa domanda è taggata javascript
meouw

2
@meouw: sono d'accordo con te. jQuery è scritto in JavaScript, tuttavia, quindi sostengo che menzionare all'OP che una biblioteca è una buona idea non significa "spingere un quadro in gola". È tutto.
rfunduk,

1351

Il modo più semplice per farlo senza alcun framework è usare il metodo element.classList.add .

var element = document.getElementById("div1");
element.classList.add("otherclass");

Modifica: e se vuoi rimuovere la classe da un elemento -

element.classList.remove("otherclass");

Preferisco non dover aggiungere spazi vuoti e duplicare le voci gestendomi da me stesso (che è necessario quando si utilizza l' document.classNameapproccio). Esistono alcune limitazioni del browser , ma puoi aggirarle usando i polyfill .


67
È un peccato che questo non sia supportato prima di IE 10.0 perché è una funzionalità eccellente e la soluzione più semplice a un problema che mi capita spesso di incontrare.
mricci,

12
È disponibile un polyfill per classList.
wcandillon,


11
Questo sembra essere il migliore da usare, poiché quelli con spazio almeno sembrano degli hack - non
mentono

5
@SilverRingvee Un ulteriore rischio dell'approccio spaziale è che alcuni altri sviluppatori potrebbero non sapere che è vitale e rimuoverlo per ripulire le cose.
akauppi

178

trova l'elemento target "d" come preferisci e poi:

d.className += ' additionalClass'; //note the space

puoi avvolgerlo in modi più intelligenti per verificare la preesistenza, controllare i requisiti di spazio ecc.


E per rimuovere usando questo metodo?
DeathGrip,

3
@DeathGrip reimposta semplicemente la classe su un singolo nome definito d.className = 'originalClass';
TheTechy,

@TheTechy - se hai più di una lezione che devi tenere (cosa che succede molto al giorno d'oggi), non funzionerà.
Mark Schultheiss,

1
Per rimuovere alla vecchia maniera, splitil nome della classe negli spazi bianchi, rimuovi quello che non desideri dall'array risultante, quindi di joinnuovo l'array ... o usa element.classList.remove.
Stijn de Witt,

131

Aggiungi classe

  • Cross Compatibile

    Nel seguente esempio aggiungiamo classnamea <body>all'elemento. Questo è compatibile con IE-8.

    var a = document.body;
    a.classList ? a.classList.add('classname') : a.className += ' classname';

    Questa è una scorciatoia per il seguente ..

    var a = document.body;
    if (a.classList) {
        a.classList.add('wait');
    } else {
        a.className += ' wait';
    }

  • Prestazione

    Se sei più interessato alle prestazioni rispetto alla compatibilità incrociata, puoi accorciarle a quanto segue, il 4% più veloce.

    var z = document.body;
    document.body.classList.add('wait');

  • Convenienza

    In alternativa, è possibile utilizzare jQuery ma le prestazioni risultanti sono notevolmente più lente. 94% più lento secondo jsPerf

    $('body').addClass('wait');


Rimozione della classe

  • Prestazione

    L'uso selettivo di jQuery è il metodo migliore per rimuovere una classe se si è interessati alle prestazioni

    var a = document.body, c = ' classname';
    $(a).removeClass(c);

  • Senza jQuery è più lento del 32%

    var a = document.body, c = ' classname';
    a.className = a.className.replace( c, '' );
    a.className = a.className + c;

Riferimenti

  1. Caso di prova jsPerf: aggiunta di una classe
  2. Caso di prova jsPerf: rimozione di una classe

Utilizzando Prototype

Element("document.body").ClassNames.add("classname")
Element("document.body").ClassNames.remove("classname")
Element("document.body").ClassNames.set("classname")

Usando YUI

YAHOO.util.Dom.hasClass(document.body,"classname")
YAHOO.util.Dom.addClass(document.body,"classname")
YAHOO.util.Dom.removeClass(document.body,"classname")

Wow grazie :) La versione abbreviata ( a.classList ? ...) avrà qualche differenza di velocità rispetto a quella normale ( if (a.classList) { ....)?
Wilf,

5
C'è anche classList.remove(). Perché non l'hai usato? è molto più veloce di jQuery jsperf.com/remove-class-vanilla-vs-jquery
Fez Vrasta

@FezVrasta classList non è supportato prima di IE 10, che ha ancora una discreta quota di mercato (+ 13% su netmarketshare.com).
Adam

6
@Adam ha usato classListtutto tranne che per rimuovere le lezioni, ecco perché lo sto chiedendo.
Fez Vrasta,

@FezVrasta In cross compatibile ho usato .add () ma solo dopo aver controllato per vedere se è disponibile, hense cross compatibile . Per rimuovere non mi sono preoccupato di ripetermi, quindi non ho incluso tante opzioni.
davidcondrey,

33

Un altro approccio per aggiungere la classe all'elemento usando JavaScript puro

Per aggiungere classe:

document.getElementById("div1").classList.add("classToBeAdded");

Per rimuovere la classe:

document.getElementById("div1").classList.remove("classToBeRemoved");

4
Gli utenti hanno già risposto più volte, comprese le discussioni sul supporto del browser e sugli shim.
bafromca,

@bafromca Non ho visto che era stata data una risposta precedente ed è un mio errore. Puoi contrassegnare questa risposta
Shoaib Chikate,

3
@ShoaibChikate: puoi anche eliminare la risposta, se lo desideri (manterrai i punti). Sto solo cercando di ridurre il disordine su questa domanda; totalmente da te.
Dan Dascalescu il

22

Quando il lavoro che sto svolgendo non garantisce l'uso di una libreria, utilizzo queste due funzioni:

function addClass( classname, element ) {
    var cn = element.className;
    //test for existance
    if( cn.indexOf( classname ) != -1 ) {
        return;
    }
    //add a space if the element already has class
    if( cn != '' ) {
        classname = ' '+classname;
    }
    element.className = cn+classname;
}

function removeClass( classname, element ) {
    var cn = element.className;
    var rxp = new RegExp( "\\s?\\b"+classname+"\\b", "g" );
    cn = cn.replace( rxp, '' );
    element.className = cn;
}

15
if( cn.indexOf( classname ) != -1 ) { return; } Fai attenzione che se aggiungi la classe "btn" con la classe "btn-info" già presente, questo non riesce.
Alexandre Dieulot,

1
dovresti usare element.className.split(" ");per prevenire il problema @AlexandreDieulot riportato qui.
Amir Fo

20

Supponendo che tu stia facendo molto più che aggiungere questa classe (ad esempio, hai richieste asincrone e così via), consiglierei una libreria come Prototype o jQuery .

Questo renderà molto semplice tutto ciò che devi fare (incluso questo).

Quindi supponiamo che tu abbia jQuery sulla tua pagina ora, potresti usare un codice come questo per aggiungere un nome di classe a un elemento (al caricamento, in questo caso):

$(document).ready( function() {
  $('#div1').addClass( 'some_other_class' );
} );

Controlla il browser dell'API jQuery per altre cose.


15

È possibile utilizzare il metodo classList.add OR classList.remove per aggiungere / rimuovere una classe da un elemento.

var nameElem = document.getElementById("name")
nameElem.classList.add("anyclss")

Il codice sopra aggiungerà (e NON sostituirà) una classe "anyclass" a nameElem. Allo stesso modo è possibile utilizzare il metodo classList.remove () per rimuovere una classe.

nameElem.classList.remove("anyclss")

molto bello, ma non supportato in IE <= 9 o Safari <= 5.0 ... :( ( caniuse.com/classlist )
simon

1
Questo è già stato discusso , incluso il supporto del browser.
Dan Dascalescu il

10

Per aggiungere una classe aggiuntiva a un elemento:

Per aggiungere una classe a un elemento, senza rimuovere / influire sui valori esistenti, aggiungi uno spazio e il nuovo nome classe, in questo modo:

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

Per modificare tutte le classi per un elemento:

Per sostituire tutte le classi esistenti con una o più nuove classi, imposta l'attributo className:

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

(È possibile utilizzare un elenco delimitato da spazi per applicare più classi.)


6

Se non vuoi usare jQuery e vuoi supportare i browser più vecchi:

function addClass(elem, clazz) {
    if (!elemHasClass(elem, clazz)) {
        elem.className += " " + clazz;
    }
}

function elemHasClass(elem, clazz) {
    return new RegExp("( |^)" + clazz + "( |$)").test(elem.className);
}

5

So che IE9 è stato chiuso ufficialmente e possiamo ottenerlo con tutti element.classListquelli sopra menzionati, ma ho appena provato a imparare come funziona senza l' classListaiuto di molte risposte sopra.

Il codice seguente estende molte risposte sopra e le migliora evitando l'aggiunta di classi duplicate.

function addClass(element,className){
  var classArray = className.split(' ');
  classArray.forEach(function (className) {
    if(!hasClass(element,className)){
      element.className += " "+className;
    }
  });            
}
//this will add 5 only once
addClass(document.querySelector('#getbyid'),'3 4 5 5 5');

5

Anch'io penso che il modo più veloce sia usare Element.prototype.classList come in es5: document.querySelector(".my.super-class").classList.add('new-class') ma in ie8 non esiste Element.prototype.classList, comunque puoi riempirlo con questo snippet (sei libero di modificarlo e migliorarlo) ):

if(Element.prototype.classList === void 0){
	function DOMTokenList(classes, self){
		typeof classes == "string" && (classes = classes.split(' '))
		while(this.length){
			Array.prototype.pop.apply(this);
		}
		Array.prototype.push.apply(this, classes);
		this.__self__ = this.__self__ || self
	}

	DOMTokenList.prototype.item = function (index){
		return this[index];
	}

	DOMTokenList.prototype.contains = function (myClass){
		for(var i = this.length - 1; i >= 0 ; i--){
			if(this[i] === myClass){
				return true;
			}
		}
		return false
	}

	DOMTokenList.prototype.add = function (newClass){
		if(this.contains(newClass)){
			return;
		}
		this.__self__.className += (this.__self__.className?" ":"")+newClass;
		DOMTokenList.call(this, this.__self__.className)
	}

	DOMTokenList.prototype.remove = function (oldClass){
		if(!this.contains(newClass)){
			return;
		}
		this[this.indexOf(oldClass)] = undefined
		this.__self__.className = this.join(' ').replace(/  +/, ' ')
		DOMTokenList.call(this, this.__self__.className)
	}

	DOMTokenList.prototype.toggle = function (aClass){
		this[this.contains(aClass)? 'remove' : 'add'](aClass)
		return this.contains(aClass);
	}

	DOMTokenList.prototype.replace = function (oldClass, newClass){
		this.contains(oldClass) && this.remove(oldClass) && this.add(newClass)
	}

	Object.defineProperty(Element.prototype, 'classList', {
		get: function() {
			return new DOMTokenList( this.className, this );
		},
		enumerable: false
	})
}


4

Giusto per elaborare ciò che altri hanno detto, più classi CSS sono combinate in una singola stringa, delimitata da spazi. Pertanto, se si desidera codificarlo, sarebbe semplicemente così:

<div class="someClass otherClass yetAnotherClass">
      <img ... id="image1" name="image1" />
</div>

Da lì puoi facilmente derivare il javascript necessario per aggiungere una nuova classe ... basta aggiungere uno spazio seguito dalla nuova classe alla proprietà className dell'elemento. Sapendo questo, puoi anche scrivere una funzione per rimuovere una classe in seguito in caso di necessità.


4

Per aggiungere, rimuovere o controllare le classi di elementi in modo semplice:

var uclass = {
    exists: function(elem,className){var p = new RegExp('(^| )'+className+'( |$)');return (elem.className && elem.className.match(p));},
    add: function(elem,className){if(uclass.exists(elem,className)){return true;}elem.className += ' '+className;},
    remove: function(elem,className){var c = elem.className;var p = new RegExp('(^| )'+className+'( |$)');c = c.replace(p,' ').replace(/  /g,' ');elem.className = c;}
};

var elem = document.getElementById('someElem');
//Add a class, only if not exists yet.
uclass.add(elem,'someClass');
//Remove class
uclass.remove(elem,'someClass');

4

È possibile utilizzare un approccio moderno simile a jQuery

Se devi modificare solo un elemento, prima quello che JS troverà in DOM, puoi usare questo:

document.querySelector('.someclass').className += " red";
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" only to first element in DOM</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

Ricorda di lasciare uno spazio prima del nome della classe.

Se hai più classi in cui desideri aggiungere una nuova classe, puoi usarla in questo modo

document.querySelectorAll('.someclass').forEach(function(element) {
  element.className += " red";
});
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" to all elements in DOM that have "someclass" class.</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>


3

Penso che sia meglio usare JavaScript puro, che possiamo eseguire sul DOM del browser.

Ecco il modo funzionale per usarlo. Ho usato ES6 ma sentiti libero di usare ES5 e l'espressione della funzione o la definizione della funzione, a seconda del tuo StyleGuide JavaScript.

'use strict'

const oldAdd = (element, className) => {
  let classes = element.className.split(' ')
  if (classes.indexOf(className) < 0) {
    classes.push(className)
  }
  element.className = classes.join(' ')
}

const oldRemove = (element, className) => {
  let classes = element.className.split(' ')
  const idx = classes.indexOf(className)
  if (idx > -1) {
    classes.splice(idx, 1)
  }
  element.className = classes.join(' ')
}

const addClass = (element, className) => {
  if (element.classList) {
    element.classList.add(className)
  } else {
    oldAdd(element, className)
  }
}

const removeClass = (element, className) => {
  if (element.classList) {
    element.classList.remove(className)
  } else {
    oldRemove(element, className)
  }
}


2

Campione con JS puro. Nel primo esempio otteniamo l'ID del nostro elemento e aggiungiamo ad esempio 2 classi.

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsById('tabGroup').className = "anyClass1 anyClass2";
})

Nel secondo esempio otteniamo il nome della classe dell'elemento e ne aggiungiamo altri 1.

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsByClassName('tabGroup')[0].className = "tabGroup ready";
})

1

Per coloro che utilizzano Lodash e desiderano aggiornare la classNamestringa:

// get element reference
var elem = document.getElementById('myElement');

// add some classes. Eg. 'nav' and 'nav header'
elem.className = _.chain(elem.className).split(/[\s]+/).union(['nav','navHeader']).join(' ').value()

// remove the added classes
elem.className = _.chain(elem.className).split(/[\s]+/).difference(['nav','navHeader']).join(' ').value()

0

per prima cosa, dai un ID al div. Quindi, chiamare la funzione appendClass:

<script language="javascript">
  function appendClass(elementId, classToAppend){
    var oldClass = document.getElementById(elementId).getAttribute("class");
    if (oldClass.indexOf(classToAdd) == -1)
    {
      document.getElementById(elementId).setAttribute("class", classToAppend);
    }
}
</script>

1
sostituirà la classe non aggiunta! Forse essere mancante una riga o una oldClass + "" + classToAppend invece dell'ultima classToAppend
Vinze

indexOfè una soluzione ingenua e ha già segnalato un problema .
Dan Dascalescu il

0

È possibile utilizzare API querySelector per selezionare l'elemento e quindi creare una funzione con l'elemento e il nuovo nome classe come parametri. Utilizzando classlist per browser moderni, altrimenti per IE8. Quindi è possibile chiamare la funzione dopo un evento.

 //select the dom element
 var addClassVar = document.querySelector('.someclass');

 //define the addclass function
 var addClass = function(el,className){
   if (el.classList){
     el.classList.add(className);
   }
   else {
     el.className += ' ' + className;
  }
};

//call the function
addClass(addClassVar, 'newClass');

Questo è già stato discusso , insieme al supporto del browser.
Dan Dascalescu il


0
document.getElementById('some_id').className+='  someclassname'

O:

document.getElementById('come_id').classList.add('someclassname')

Il primo approccio ha aiutato ad aggiungere la classe quando il secondo approccio non ha funzionato.
Non dimenticare di mantenere uno spazio di fronte al' someclassname' al primo approccio.

Per la rimozione puoi usare:

document.getElementById('some_id').classList.remove('someclassname')

-4

Questo codice js funziona per me

fornisce la sostituzione del nome di classe

var DDCdiv = hEle.getElementBy.....

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta[i] = 'hidden';
        break;// quit for loop
    }
    else if (Ta[i] == 'hidden'){
        Ta[i] = 'visible';
    break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

Per aggiungere basta usare

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
Ta.push('New class name');
// Ta.push('Another class name');//etc...
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

Per rimuovere l'uso

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array

for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta.splice( i, 1 );
        break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

Spero che questo sia utile per sombody


-9

In YUI, se si include yuidom , è possibile utilizzare

YAHOO.util.Dom.addClass('div1','className');

HTH


12
Diceva JavaScript, non jQuery o YUI.
Radek,
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.