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:
- 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.
- JQuery fait quelques vérifications nécessaires dans ses implémentations
addClass
et 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 removeClass
implé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 collapse
classe 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.
.hasClass
uniquement 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