Це питання привернуло мою увагу наступним чином іншого, який був позначений як дублікат цього .
Ця відповідь підсумовує прийняту відповідь з невеликою кількістю доданих деталей.
Ви намагаєтесь оптимізувати, уникаючи зайвої перевірки, у зв'язку з цим ось фактори, які ви повинні знати:
- неможливо мати дублікати імен класу в атрибуті класу за допомогою маніпулювання елементом 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 не дублює класи