To pytanie zwróciło moją uwagę po kolejnym, które zostało oznaczone jako duplikat tego .
Ta odpowiedź podsumowuje zaakceptowaną odpowiedź z niewielkimi dodatkowymi szczegółami.
Próbujesz zoptymalizować, unikając niepotrzebnego sprawdzania, w związku z tym oto czynniki, o których musisz wiedzieć:
- nie można mieć zduplikowanych nazw klas w atrybucie klasy poprzez manipulowanie elementem DOM za pomocą JavaScript. Jeśli masz
class="collapse"
w kodzie HTML, wywołanie Element.classList.add("collapse");
nie spowoduje dodania dodatkowej klasy zwijania . Nie znam podstawowej implementacji, ale przypuszczam, że powinna być wystarczająco dobra.
- JQuery dokonuje niezbędnych kontroli w swoim
addClass
i removeClass
implementacjach (sprawdziłem kod źródłowy ). Po addClass
wykonaniu pewnych sprawdzeń i jeśli klasa istnieje, JQuery nie próbuje jej ponownie dodać. Podobnie w przypadku removeClass
JQuery robi coś, cur.replace( " " + clazz + " ", " " );
co powoduje usunięcie klasy tylko wtedy, gdy istnieje.
Warto zauważyć, że JQuery przeprowadza pewną optymalizację swojej removeClass
implementacji, aby uniknąć bezcelowego ponownego renderowania. Tak to wygląda
...
// only assign if different to avoid unneeded rendering.
finalValue = value ? jQuery.trim( cur ) : "";
if ( elem.className !== finalValue ) {
elem.className = finalValue;
}
...
Zatem najlepszą mikrooptymalizacją, jaką można by zrobić, byłaby uniknięcie narzutu wywołań funkcji i związanych z nimi kontroli implementacji.
Powiedzmy, że chcesz zmienić klasę o nazwie collapse
, jeśli masz pełną kontrolę nad tym, kiedy klasa jest dodawana lub usuwana, a jeśli collapse
klasa jest początkowo nieobecna, możesz zoptymalizować w następujący sposób:
$(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;
}
};
})());
Na marginesie, jeśli przełączasz klasę z powodu zmian w pozycji przewijania, zdecydowanie zalecamy ograniczenie obsługi zdarzeń przewijania.
.hasClass
tylko wtedy, gdy muszę sprawdzić, czy klasa istnieje, jeśli muszę tylko przypisać klasę - używam.addClass
. jQuery nie powiela klas