Supprimer toutes les classes sauf une

Eh bien, je sais qu'avec certaines actions jQuery, nous pouvons ajouter beaucoup de classes à un div particulier:

<div class="cleanstate"></div>

Disons qu'avec quelques clics et d'autres choses, la div reçoit beaucoup de classes

<div class="cleanstate bgred paddingleft allcaptions ..."></div>

Alors, comment puis-je supprimer toutes les classes sauf une? La seule idée que je suis venu est avec ceci:

$('#container div.cleanstate').removeClass().addClass('cleanstate');

Alors que removeClass() tue toutes les classes, la div se fait foirer, mais en ajoutant juste après addClass('cleanstate') cela revient à la normale. L'autre solution consiste à mettre un attribut ID avec le les propriétés CSS de base afin qu'elles ne soient pas supprimées, ce qui améliore également les performances, mais je veux juste connaître une autre solution pour se débarrasser de tout sauf ".cleanstate "

Je pose cette question parce que, dans le script réel, la div subit divers changements de classes.

77
demandé sur DarkGhostHunter 2011-03-19 19:26:22

6 réponses

Au lieu de le faire en 2 étapes, vous pouvez simplement réinitialiser la valeur entière à la fois avec attr en écrasant toutes les valeurs de classe avec la classe que vous voulez:

jQuery('#container div.cleanstate').attr('class', 'cleanstate');

Échantillon: http://jsfiddle.net/jtmKK/1/

181
répondu Yahel 2011-03-19 16:36:16

Utiliser attr pour définir directement l'attribut de classe à la valeur spécifique que vous souhaitez:

$('#container div.cleanstate').attr('class','cleanstate');
29
répondu tvanfosson 2011-03-19 16:30:52

Avec un vieux JavaScript simple, pas JQuery:

document.getElementById("container").className = "cleanstate";
14
répondu Rob at TVSeries.com 2012-02-09 15:23:03

Parfois, vous devez conserver certaines classes en raison de l'animation CSS, car dès que vous supprimez toutes les classes, l'animation peut ne pas fonctionner. Au lieu de cela, vous pouvez garder certaines classes et supprimer le reste comme ceci:

$('#container div.cleanstate').removeClass('removethis removethat').addClass('cleanstate');
3
répondu Nizzy 2016-06-24 22:16:25

En ce qui concerne la réponse de robs et pour et par souci d'exhaustivité, vous pouvez également utiliser querySelector avec vanilla

document.querySelector('#container div.cleanstate').className = "cleanstate";
2
répondu rob 2015-11-04 08:21:03

Que faire si vous voulez garder une ou plusieurs classes et que vous voulez des classes sauf celles-ci. Ces solutions ne fonctionneraient pas là où vous ne voulez pas supprimer toutes les classes ajouter à nouveau cette classe perticulaire. L'utilisation d'attr et removeClass() réinitialise toutes les classes en première instance, puis attache à nouveau cette classe perticulaire. Si vous utilisez une animation sur les classes qui sont réinitialisées à nouveau, cela échouera.

Si vous voulez simplement supprimer toutes les classes sauf une classe, alors c'est pour vous. Mon la solution est pour: removeAllExceptThese

Array.prototype.diff = function(a) {
            return this.filter(function(i) {return a.indexOf(i) < 0;});
        };
$.fn.removeClassesExceptThese = function(classList) { 
/* pass mutliple class name in array like ["first", "second"] */
            var $elem = $(this);

            if($elem.length > 0) {
                var existingClassList = $elem.attr("class").split(' ');
                var classListToRemove = existingClassList.diff(classList);
                $elem
                    .removeClass(classListToRemove.join(" "))
                    .addClass(classList.join(" "));
            }
            return $elem;
        };

cela ne réinitialisera pas toutes les classes, il supprimera seulement nécessaire.
J'en avais besoin dans mon projet où je devais supprimer uniquement les classes ne correspondant pas.

Vous pouvez utiliser $(".third").removeClassesExceptThese(["first", "second"]);

0
répondu No one 2018-03-02 09:20:39