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

34

Error: User Rate Limit ExceededremoveClassError: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded

Поскольку он работает и не выдает ошибок, по-видимому, это не является необходимым. Вы не должны пытаться угадать обработку исключений в стороннем коде & # x2014; если оно не позволяет исключению уйти неперехваченным, то оно обрабатывается. lanzz
хорошо JQuery избегает ошибки в большинстве случаев, и да, это работает user917670
Вы пробовали, если это работает так или иначе? Сделал это? lanzz

Ваш Ответ

3   ответа
5

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

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

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

Error: User Rate Limit Exceeded
38

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

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

это объясняет вещи. Спасибо user917670
hasClass может не потребоваться для корректной работы, но некоторые быстрые тесты показывают, что быстрее проверять сначала (по крайней мере, для меня в трех разных браузерах) -jsfiddle.net/trevorpower/5mu7shg1/2
+1 за отличное объяснение
3

Нет, не нужно проверятьremoveClass().

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

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

Похожие вопросы