Vérifiez si la classe est déjà attribuée avant d'ajouter

113

Dans jQuery, est-il recommandé de vérifier si une classe est déjà affectée à un élément avant d'ajouter cette classe? Cela aura-t-il même un effet quelconque?

Par exemple:

<label class='foo'>bar</label>

En cas de doute si une classe baza déjà été attribuée label, serait-ce la meilleure approche:

var class = 'baz';
if (!$('label').hasClass(class)) {
  $('label').addClass(class);
}

ou cela suffirait-il:

$('label').addClass('baz');
Muleskinner
la source
12
Je l'ai utilisé .hasClassuniquement lorsque j'ai besoin de vérifier si la classe existe, si j'ai juste besoin d'attribuer une classe - j'utilise .addClass. jQuery ne duplique pas les classes
Samich
7
Ajoutez simplement la classe sans tester. S'il existe déjà, il ne sera plus ajouté.
Blazemonger

Réponses:

177

Appelez addClass(). jQuery effectuera la vérification pour vous. Si vous vérifiez vous-même, vous doublez le travail, car jQuery exécutera toujours la vérification pour vous.

jmar777
la source
47

Une simple vérification dans la console vous aurait dit qu'appeler addClassplusieurs fois avec la même classe est sûr.

Plus précisément, vous pouvez trouver le chèque dans la source

if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
  setClass += classNames[ c ] + " ";
}
Raynos
la source
2
Veuillez relire ma question et vous remarquerez qu'il ne s'agit pas d'être en sécurité mais de bonnes pratiques
Muleskinner
7
D'après votre réponse modifiée, je vois que jQuery vérifie réellement si la classe est déjà attribuée avant de l'ajouter, c'est-à-dire que ce serait une mauvaise pratique de faire la vérification vous-même / merci
Muleskinner
5
@Muleskinner c'est ce que je voulais dire.
Raynos
41
@Raynos: Une simple vérification dans la console vous aurait dit qu'appeler addClass plusieurs fois avec la même classe est sûr. Pourtant, cette question a été l'un des meilleurs succès lorsque j'ai cherché une réponse sur Google ... Même les choses triviales qui sont bien documentées ailleurs ont à mon goût une place sur Stack Overflow.
eirirlar
10
Il y a beaucoup trop d'attitude dans cette réponse. J'aurais pu y répondre avec un peu de tact.
dreadwail
4

Cette question a attiré mon attention après une autre qui a été marquée comme un double de celle-ci .

Cette réponse résume la réponse acceptée avec un petit détail supplémentaire.

Vous essayez d'optimiser en évitant une vérification inutile, à cet égard, voici des facteurs dont vous devez être conscient:

  1. il n'est pas possible d'avoir des noms de classe en double dans l'attribut class en manipulant un élément DOM via JavaScript. Si vous en avez class="collapse"dans votre code HTML, l'appel Element.classList.add("collapse");n'ajoutera pas de classe de réduction supplémentaire . Je ne connais pas l'implémentation sous-jacente, mais je suppose qu'elle devrait être assez bonne.
  2. JQuery fait quelques vérifications nécessaires dans ses implémentations addClasset removeClass(j'ai vérifié le code source ). Car addClass, après avoir fait quelques vérifications et si une classe existe, JQuery n'essaye pas de l'ajouter à nouveau. De même pour removeClass, JQuery fait quelque chose le long de la ligne cur.replace( " " + clazz + " ", " " );qui supprimera une classe uniquement si elle existe.

A noter, JQuery optimise son removeClassimplémentation afin d'éviter un re-rendu inutile. Ça va comme ça

...
// only assign if different to avoid unneeded rendering.
finalValue = value ? jQuery.trim( cur ) : "";
if ( elem.className !== finalValue ) {
    elem.className = finalValue;
}
...

La meilleure micro- optimisation que vous puissiez faire serait donc d'éviter les frais généraux d'appel de fonction et les vérifications d'implémentation associées.

Supposons que vous souhaitiez basculer une classe nommée collapse, si vous contrôlez totalement le moment où la classe est ajoutée ou supprimée, et si la collapseclasse est initialement absente, vous pouvez alors optimiser comme suit:

$(document).on("scroll", (function () {
    // hold state with this field
    var collapsed = false;

    return function () {
        var scrollTop, shouldCollapse;

        scrollTop = $(this).scrollTop();
        shouldCollapse = scrollTop > 50;

        if (shouldCollapse && !collapsed) {
            $("nav .branding").addClass("collapse");
            collapsed = true;

            return;
        }

        if (!shouldCollapse && collapsed) {
            $("nav .branding").removeClass("collapse");
            collapsed = false;
        }
    };
})());

En passant, si vous basculez une classe en raison de changements dans la position de défilement, il est fortement recommandé de limiter la gestion des événements de défilement.

Igwe Kalu
la source
1
$("label")
  .not(".foo")
  .addClass("foo");
טאבו ישראל שרות לקוחות
la source