Должен hasClass предшествовать removeClass - jQuery
Нужно ли проверять, существует ли класс, прежде чем я использую removeClass
api для объекта jquery?
например.
if($(this).hasClass("test"))
$(this).removeClass("test");
или
$(this).removeClass("test");
если не нужно, почему так?
Ответы
Ответ 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");