这个问题引起了我的注意,另一个问题被标记为该问题的重复。
该答案总结了接受的答案,并增加了一些细节。
您正在尝试通过避免不必要的检查来进行优化,在这方面,您必须意识到以下因素:
- 通过JavaScript操纵DOM元素,就不可能在class属性中有重复的类名。如果您使用
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不会重复这些类