应该hasClass在removeClass之前 - jQuery

use*_*670 34 jquery

removeClass在jquery对象上使用api 之前是否有必要检查一个类是否存在?例如.

if($(this).hasClass("test"))
   $(this).removeClass("test");
Run Code Online (Sandbox Code Playgroud)

要么

$(this).removeClass("test");
Run Code Online (Sandbox Code Playgroud)

如果没有必要,为什么呢?

Vis*_*ioN 38

使用这个:

$(this).removeClass("test");
Run Code Online (Sandbox Code Playgroud)

没有必要检查班级存在.

jQuery源代码我们可以看到该removeClass方法使用replace方法来删除子字符串:

className = (" " + elem.className + " ").replace(rclass, " ");
for (c = 0, cl = classNames.length; c < cl; c++) {
    className = className.replace(" " + classNames[c] + " ", " ");
}?
Run Code Online (Sandbox Code Playgroud)

replace如果匹配的子字符串不存在,则不会删除任何内容.

  • 正确的功能可能不需要`hasClass`,但是一些快速测试表明,第一次检查更快(至少对于我来说使用三种不同的浏览器而言)-https://jsfiddle.net/trevorpower/5mu7shg1/2/ (2认同)

wer*_*ter 6

至少对于Chrome,在removeClass()之前添加hasClass()检查很有用,因为即使字符串没有更改,jQuery也会无条件地将elem.className分配给新字符串,这会导致Chrome无效并重新计算布局.

有人可能会认为这是Chrome中的一个错误,它应该检查className是否实际上已从之前的值更改.但是,也可能是浏览器必须重新计算布局,因为在html规范的某些地方编写了一些模糊的要求.

我还没有测试过Firefox.Safari Web检查器没用,因为它不会告诉您为什么布局无效/重新计算(javascript函数导致它).