Esta pregunta llamó mi atención después de otra que se marcó como un duplicado de esta .
Esta respuesta resume la respuesta aceptada con un pequeño detalle adicional.
Está tratando de optimizar evitando una verificación innecesaria, en este sentido, aquí hay factores que debe tener en cuenta:
- no es posible tener nombres de clase duplicados en el atributo de clase mediante la manipulación de un elemento DOM a través de JavaScript. Si tiene
class="collapse"
en su HTML, llamar Element.classList.add("collapse");
no agregará una clase de colapso adicional . No conozco la implementación subyacente, pero supongo que debería ser lo suficientemente buena.
- JQuery hace algunas comprobaciones necesarias en sus
addClass
y removeClass
implementaciones (he comprobado el código fuente ). Porque addClass
, después de hacer algunas comprobaciones y si existe una clase, JQuery no intenta agregarla nuevamente. De manera similar removeClass
, JQuery hace algo en la línea de lo cur.replace( " " + clazz + " ", " " );
cual eliminará una clase solo si existe.
Cabe destacar que JQuery hace algunas optimizaciones en su removeClass
implementación para evitar una re-renderización inútil. Dice así
...
// only assign if different to avoid unneeded rendering.
finalValue = value ? jQuery.trim( cur ) : "";
if ( elem.className !== finalValue ) {
elem.className = finalValue;
}
...
Entonces, la mejor micro optimización que podría hacer sería con el objetivo de evitar los gastos generales de llamadas a funciones y las verificaciones de implementación asociadas.
Digamos que desea alternar una clase nombrada collapse
, si tiene el control total de cuándo se agrega o quita la collapse
clase , y si la clase está inicialmente ausente, entonces puede optimizar de la siguiente manera:
$(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;
}
};
})());
Además, si está alternando una clase debido a cambios en la posición de desplazamiento, se recomienda encarecidamente que acelere el manejo del evento de desplazamiento.
.hasClass
solo cuando necesito verificar si la clase existe, si solo necesito asignar una clase, uso.addClass
. jQuery no duplica las clases