Подтвердить что ты не робот

Должен hasClass предшествовать removeClass - jQuery

Нужно ли проверять, существует ли класс, прежде чем я использую removeClass api для объекта jquery? например.

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

или

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

если не нужно, почему так?

4b9b3361

Ответ 1

Используйте только это:

$(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 ничего не удалит, если соответствующая подстрока не существует.

Ответ 2

По крайней мере, для Chrome полезно добавить проверку hasClass() перед removeClass(), поскольку jQuery безоговорочно назначает elem.className для новой строки, даже если строка не изменилась, что заставляет Chrome сделать недействительным и пересчитать макет.

Можно утверждать, что это ошибка в Chrome, и она должна проверить, действительно ли className изменилось с предыдущего значения. Однако также может быть, что браузер должен пересчитать макет из-за некоторых неясных требований, которые написаны где-то глубоко в спецификации html.

Я не тестировал Firefox. Веб-инспектор Safari бесполезен, так как он не скажет вам, почему макет был недействителен/пересчитан (какая функция javascript вызвала его).

Ответ 3

Нет, нет необходимости проверять removeClass().

Просто используйте

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