应该hasClass在removeClass之前 - jQuery

时间:2012-06-05 10:27:53

标签: jquery

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

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

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

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

3 个答案:

答案 0 :(得分:38)

使用这个:

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

无需检查班级存在。

jQuery sources我们可以看到removeClass方法使用replace方法删除子字符串:

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

不,无需检查removeClass()

只需使用

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