在添加之前检查类是否已分配

Mul*_*ner 110 jquery addclass

在jQuery中,是否建议在添加该类之前检查是否已将类分配给元素?它甚至会产生任何影响吗?

例如:

<label class='foo'>bar</label>
Run Code Online (Sandbox Code Playgroud)

如果对类baz已经被分配有疑问label,这将是最好的方法:

var class = 'baz';
if (!$('label').hasClass(class)) {
  $('label').addClass(class);
}
Run Code Online (Sandbox Code Playgroud)

或者这就足够了:

$('label').addClass('baz');
Run Code Online (Sandbox Code Playgroud)

jma*_*777 175

打电话吧addClass().jQuery会为你做检查.如果您自己检查,那么您的工作量会增加一倍,因为jQuery 仍会为您运行检查.


Ray*_*nos 46

在控制台中进行简单的检查会告诉您,addClass使用同一个类多次调用是安全的.

具体来说,您可以在源中找到支票

if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
  setClass += classNames[ c ] + " ";
}
Run Code Online (Sandbox Code Playgroud)

  • @Raynos:**在控制台中进行一次简单的检查就会告诉你,使用同一个类多次调用addClass是安全的.**但是,当我用Google搜索答案时,这个问题仍然是最受欢迎的问题之一...甚至是琐碎的在其他地方有充分记录的东西在Stack Overflow上有一席之地. (41认同)
  • 在这个答案中有太多的态度.可以用一些机智回答它. (10认同)
  • 从您编辑的答案中我看到jQuery实际上在添加之前检查是否已经分配了类,即自己进行检查是不好的做法/谢谢 (7认同)
  • @Muleskinner这就是我所暗示的. (5认同)
  • 请重新阅读我的问题,你会注意到它不是关于安全,而是关于最佳实践 (2认同)
  • @Raynos **通过任何方式在控制台中进行简单检查**!== **文档**。可能因浏览器而异。但是,**来源**是一个更好的选择。谢谢你 (2认同)

Igw*_*alu 5

这个问题引起了我的注意,另一个问题被标记为与这个问题重复

这个答案总结了已接受的答案,并添加了一些细节。

您试图通过避免不必要的检查来进行优化,在这方面,您必须注意以下因素:

  1. 通过 JavaScript 操作 DOM 元素,类属性中不可能出现重复的类名。如果您class="collapse"的 HTML 中有,调用Element.classList.add("collapse");不会添加额外的折叠类。我不知道底层的实现,但我想它应该足够好了。
  2. 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;
}
...
Run Code Online (Sandbox Code Playgroud)

因此,您可以做的最好的微观优化是为了避免函数调用开销和相关的实现检查。

假设您想要切换名为 的类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;
        }
    };
})());
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您由于滚动位置的变化而切换类,强烈建议您限制滚动事件处理。