Questa domanda ha attirato la mia attenzione dopo un'altra che è stata contrassegnata come un duplicato di questa .
Questa risposta riassume la risposta accettata con un piccolo dettaglio in più.
Stai cercando di ottimizzare evitando un controllo non necessario, a questo proposito ecco i fattori di cui devi essere a conoscenza:
- non è possibile avere nomi di classi duplicati nell'attributo di classe manipolando un elemento DOM tramite JavaScript. Se hai
class="collapse"
nel tuo HTML, la chiamata Element.classList.add("collapse");
non aggiungerà un'ulteriore compressione classe di . Non conosco l'implementazione sottostante, ma suppongo che dovrebbe essere abbastanza buona.
- JQuery effettua alcuni controlli necessari nelle sue
addClass
e removeClass
implementazioni (ho controllato il codice sorgente ). Infatti addClass
, dopo aver effettuato alcuni controlli e se esiste una classe, JQuery non prova ad aggiungerla di nuovo. Allo stesso modo removeClass
, JQuery fa qualcosa lungo la linea del cur.replace( " " + clazz + " ", " " );
quale rimuoverà una classe solo se esiste.
Degno di nota, JQuery fa alcune ottimizzazioni nella sua removeClass
implementazione per evitare un inutile re-rendering. Va così
...
// only assign if different to avoid unneeded rendering.
finalValue = value ? jQuery.trim( cur ) : "";
if ( elem.className !== finalValue ) {
elem.className = finalValue;
}
...
Quindi la migliore micro ottimizzazione che potresti fare sarebbe quella di evitare i sovraccarichi delle chiamate di funzione e i controlli di implementazione associati.
Supponi di voler attivare o disattivare una classe denominata collapse
, se hai il totale controllo di quando la classe viene aggiunta o rimossa e se la collapse
classe è inizialmente assente, puoi ottimizzare come segue:
$(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;
}
};
})());
Per inciso, se stai alternando una classe a causa di cambiamenti nella posizione di scorrimento, ti consigliamo vivamente di limitare la gestione degli eventi di scorrimento.
.hasClass
solo quando ho bisogno di controllare se la classe esiste, se ho solo bisogno di assegnare la classe - io uso.addClass
. jQuery non duplica le classi