35

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

if($(this).hasClass("test"))
   $(this).removeClass("test");

或者

$(this).removeClass("test");

如果没有必要,为什么会这样?

4

3 回答 3

39

只使用这个:

$(this).removeClass("test");

无需检查类是否存在。

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

className = (" " + elem.className + " ").replace(rclass, " ");
for (c = 0, cl = classNames.length; c < cl; c++) {
    className = className.replace(" " + classNames[c] + " ", " ");
}​

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

于 2012-06-05T10:30:09.933 回答
6

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

有人可能会争辩说这是 Chrome 中的一个错误,它应该检查 className 是否实际上已从以前的值更改。但是,也可能是浏览器必须重新计算布局,因为一些模糊的要求写在 html 规范的深处。

我还没有测试过火狐。Safari 网络检查器是无用的,因为它不会告诉您为什么布局无效/重新计算(哪个 javascript 函数导致它)。

于 2013-06-21T06:36:36.627 回答
3

不,不需要检查removeClass().

只需使用

   $(this).removeClass("test");
于 2012-06-05T10:30:18.467 回答