Це питання привернуло мою увагу наступним чином іншого, який був позначений як дублікат цього .
Ця відповідь підсумовує прийняту відповідь з невеликою кількістю доданих деталей.
Ви намагаєтесь оптимізувати, уникаючи зайвої перевірки, у зв'язку з цим ось фактори, які ви повинні знати:
- неможливо мати дублікати імен класу в атрибуті класу за допомогою маніпулювання елементом DOM через JavaScript. Якщо у вас є
class="collapse"HTML, виклик Element.classList.add("collapse");не додасть додаткового згортання клас . Я не знаю основної реалізації, але я вважаю, що вона повинна бути досить хорошою.
- JQuery робить деякі необхідні перевірки в його
addClassта removeClassреалізаціях (я перевірив вихідний код ). Тому що addClassпісля деяких перевірок і наявності класу JQuery не намагається його знову додати. Аналогічно removeClass, і JQuery робить щось, у рядку cur.replace( " " + clazz + " ", " " );якого буде видалено клас, лише якщо він існує.
Варто зауважити, JQuery робить певну оптимізацію в його removeClassреалізації, щоб уникнути безглуздого повторного відображення. Виходить так
...
// only assign if different to avoid unneeded rendering.
finalValue = value ? jQuery.trim( cur ) : "";
if ( elem.className !== finalValue ) {
elem.className = finalValue;
}
...
Таким чином, найкраща мікрооптимізація, яку ви могли б зробити, була б з метою уникнути накладних витрат викликів функцій та відповідних перевірок впровадження.
Скажімо, ви хочете переключити клас з назвою collapse, якщо ви повністю контролюєте, коли клас додається чи видаляється, і якщо collapseклас спочатку відсутній, ви можете оптимізувати наступним чином:
$(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;
}
};
})());
Крім того, якщо ви перемикаєте клас через зміни положення прокрутки, вам дуже рекомендується придушити обробку подій прокрутки.
.hasClassлише тоді, коли мені потрібно перевірити, чи існує клас, якщо мені просто потрібно призначити клас - я використовую.addClass. jQuery не дублює класи