
В современных веб-приложениях точное управление классами элементов позволяет изменять внешний вид и поведение интерфейса без лишних перерисовок. В JavaScript для проверки присутствия класса у элемента используется метод classList.contains(), который возвращает логическое значение: true, если класс присутствует, и false, если отсутствует.
Метод classList.contains() работает напрямую с DOM-элементом и поддерживает одновременную проверку нескольких классов через последовательные вызовы. Например, проверка наличия классов «active» и «hidden» требует отдельного вызова для каждого класса, что обеспечивает точное управление состояниями элементов.
Для динамических интерфейсов важно сочетать проверку наличия класса с методами classList.add() и classList.remove(). Это позволяет условно добавлять или удалять стили без перезаписи всего атрибута class, снижая вероятность конфликтов и повышая производительность рендеринга.
При работе с селекторами, возвращающими коллекции элементов, рекомендуется применять forEach() или Array.from() для итерации и проверки класса у каждого элемента. Такой подход предотвращает ошибки при изменении DOM и обеспечивает масштабируемость кода при работе с большими списками элементов.
Использование метода classList.contains для одного класса

Метод classList.contains проверяет, присутствует ли у элемента определённый класс, возвращая true или false. Он работает только с одним классом за вызов и не поддерживает проверку нескольких классов одновременно.
Пример проверки: element.classList.contains('active'). Если элемент имеет класс active, метод вернёт true, иначе false. Такой подход эффективен для условного применения логики на основе наличия класса.
Рекомендуется использовать classList.contains перед добавлением или удалением класса, чтобы избежать дублирования и ненужных изменений DOM. Например, проверка перед добавлением: if (!element.classList.contains('highlight')) element.classList.add('highlight');.
Метод поддерживается во всех современных браузерах и обеспечивает высокую производительность по сравнению с проверкой через element.className.includes(), так как работает напрямую с коллекцией классов.
Для динамических интерфейсов и управления состоянием элементов classList.contains позволяет точно определять, какой класс активен, и применять соответствующие действия без сложных регулярных выражений или строковых манипуляций.
Проверка нескольких классов через цепочку contains
Для проверки нескольких классов у элемента в JavaScript можно использовать метод classList.contains последовательно. Каждый вызов возвращает true, если указанный класс присутствует, и false в противном случае.
Пример проверки двух классов одновременно:
const elem = document.querySelector('.example');
if (elem.classList.contains('active') && elem.classList.contains('highlight')) {
console.log('Оба класса присутствуют');
}
Для проверки произвольного количества классов можно использовать массив и метод every:
const requiredClasses = ['active', 'highlight', 'visible'];
const hasAllClasses = requiredClasses.every(cls => elem.classList.contains(cls));
if (hasAllClasses) console.log('Все указанные классы присутствуют');
Цепочка contains эффективна для точной проверки, когда важна комбинация классов. Для динамических списков классов рекомендуется создавать массив требуемых классов и проверять его с помощью every или some, если достаточно одного совпадения.
Использование цепочки contains предпочтительно перед ручной проверкой строки className, так как classList учитывает точные совпадения и игнорирует лишние пробелы.
Работа с классами через свойство className
Свойство className позволяет получать и изменять все классы элемента как одну строку. Для проверки наличия конкретного класса необходимо использовать методы работы со строками, например includes или регулярные выражения.
Пример проверки класса:
const elem = document.getElementById('myElement');
if (elem.className.includes('active')) {
console.log('Элемент активен');
}
Добавление класса через className требует сохранения существующих классов, чтобы не перезаписать их:
if (!elem.className.includes('highlight')) {
elem.className += ' highlight';
}
Удаление класса выполняется с использованием replace и регулярного выражения, учитывая пробелы для точного удаления:
elem.className = elem.className.replace(/\bhighlight\b/g, '').trim();
Таблица основных операций с className:
| Операция | Пример | Особенности |
|---|---|---|
| Проверка класса | elem.className.includes('active') |
Чувствительна к регистру, не разделяет отдельные слова |
| Добавление класса | elem.className += ' newClass' |
Не перезаписывает другие классы, нужно добавлять пробел |
| Удаление класса | elem.className = elem.className.replace(/\boldClass\b/g, '') |
Регулярное выражение предотвращает удаление части слова |
| Замена класса | elem.className = elem.className.replace(/\bold\b/g, 'new') |
Меняет только точное совпадение |
Использование className удобно для работы с полным списком классов, но требует аккуратной обработки пробелов и точного соответствия имен. Для динамического управления отдельными классами предпочтительнее classList.
Сравнение подходов: classList vs className
Метод classList предоставляет объект с набором встроенных методов для работы с классами: add, remove, toggle, contains. Он позволяет проверять наличие класса через element.classList.contains('имя-класса') с точным совпадением и без необходимости вручную разбирать строку.
Свойство className возвращает строку всех классов элемента. Проверка класса требует сопоставления через регулярное выражение или метод split(' '), что увеличивает вероятность ошибок при совпадении подстрок или лишних пробелов.
Производительность classList оптимизирована для операций добавления и удаления отдельных классов без полной перезаписи строки, тогда как className при изменении любого класса перезаписывает всю строку, что может быть менее эффективно на больших DOM-структурах.
Для динамического управления классами, где часто требуется проверка, добавление и удаление, classList безопаснее и проще в поддержке. className подходит для массовой замены всех классов элемента или при необходимости совместимости со старыми браузерами, не поддерживающими classList.
Рекомендация: использовать classList в большинстве случаев для точных и читаемых операций с классами. className оставлять для случаев полной замены классов или минимизации зависимостей от современных методов.
Проверка наличия класса при динамически добавленных элементах
При работе с элементами, создаваемыми динамически через JavaScript, стандартная проверка класса с помощью element.classList.contains() не всегда эффективна до момента добавления элемента в DOM. Для таких случаев используют делегирование событий или наблюдатели за изменениями DOM.
Метод MutationObserver позволяет отслеживать появление новых элементов и проверять их классы сразу после вставки. Пример использования:
const observer = new MutationObserver((mutations) => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if(node.nodeType === 1 && node.classList.contains(‘target-class’)) {
console.log(‘Элемент с нужным классом добавлен’);
}
});
});
});
observer.observe(document.body, { childList: true, subtree: true });
Если проверка требуется при клике или другом событии, лучше использовать делегирование событий. Вместо привязки обработчика к динамическому элементу, его назначают родительскому контейнеру, а внутри проверяют наличие класса:
document.body.addEventListener(‘click’, (e) => {
if(e.target.classList.contains(‘target-class’)) {
console.log(‘Нажат элемент с нужным классом’);
}
});
Такой подход минимизирует необходимость повторного поиска элементов и гарантирует, что проверка класса сработает даже для элементов, добавленных после загрузки страницы.
При сложных интерфейсах рекомендуется комбинировать MutationObserver для вставки элементов и делегирование событий для интерактивного взаимодействия, что обеспечивает стабильную проверку классов в любых условиях.
Учет регистра при проверке классов

В JavaScript методы работы с классами чувствительны к регистру. Например, element.classList.contains('active') вернет false, если в HTML класс задан как Active или ACTIVE. Игнорирование регистра приводит к неправильной логике проверки.
Рекомендации по безопасной проверке:
- Всегда использовать точное совпадение регистра при вызове
classList.contains. - Если требуется нечувствительная к регистру проверка, приводите обе строки к одному регистру:
const hasClass = Array.from(element.classList)
.some(cls => cls.toLowerCase() === 'active');
- Для динамически формируемых классов храните их в одном регистре, чтобы избежать ошибок.
- При использовании селекторов через
querySelectorилиquerySelectorAllучитывайте, что CSS-классы чувствительны к регистру в HTML, но не всегда в некоторых XML-документах.
Особенности браузеров:
- Все современные движки (Chrome, Firefox, Edge, Safari) строго соблюдают регистр в
classList. - Старые версии IE могли вести себя непредсказуемо, поэтому для кроссбраузерной поддержки стоит использовать стандартное приведение к одному регистру.
Использование querySelector и селекторов по классу

Метод querySelector позволяет получить первый элемент, соответствующий заданному CSS-селектору. Для проверки наличия класса используется селектор по классу с точкой перед именем.
Пример поиска элемента с классом active:
const element = document.querySelector('.active');
Если элемент найден, переменная element будет содержать объект DOM. Если элементов с таким классом нет, вернётся null.
Рекомендации при использовании селекторов по классу:
- Использовать точное имя класса, включая регистр символов.
querySelector('.Active')не найдётclass="active". - Можно комбинировать селекторы:
querySelector('div.active')вернёт первый<div>с классомactive. - Для нескольких элементов применять
querySelectorAll, так какquerySelectorвсегда возвращает только первый совпадающий элемент.
Проверка наличия класса у найденного элемента:
if (element && element.classList.contains('active')) {
console.log('Элемент содержит класс active');
}
Использование querySelector эффективно для динамических страниц, где элементы могут появляться после загрузки. Можно комбинировать с событиями и изменением классов:
document.querySelector('.button').addEventListener('click', () => {
const target = document.querySelector('.menu');
if (target && target.classList.contains('open')) {
target.classList.remove('open');
} else {
target.classList.add('open');
}
});
При больших деревьях DOM избегайте сложных селекторов с множественными уровнями вложенности, чтобы не снижать производительность.
Обработка ошибок при отсутствии элемента в DOM
При работе с DOM часто возникает ситуация, когда ожидаемый элемент отсутствует на странице. Вызов методов вроде classList.contains на null приведёт к ошибке TypeError. Для предотвращения её используйте проверку существования элемента перед обращением к свойствам:
const element = document.querySelector('.my-class');
if (element) {
element.classList.add('active');
}
Альтернатива – оператор опциональной цепочки ?., который безопасно проверяет наличие объекта перед доступом к его свойствам:
document.querySelector('.my-class')?.classList.add('active');
При динамически создаваемых элементах рекомендуется использовать делегирование событий вместо прямого обращения к потенциально отсутствующему элементу. Это снижает риск ошибок и упрощает поддержку кода.
const element = document.getElementById('target');
if (!element) {
console.warn('Элемент #target не найден в DOM');
}
В случаях массовых проверок нескольких элементов используйте цикл с фильтрацией null, чтобы исключить несуществующие узлы и предотвратить падение скрипта:
const items = document.querySelectorAll('.item');
items.forEach(el => {
if (el) el.classList.toggle('highlight');
});
Системный подход: всегда предполагаете, что элемент может отсутствовать, и применяете проверку, оператор опциональной цепочки или делегирование. Это уменьшает количество ошибок и делает код безопасным при любых изменениях DOM.
Вопрос-ответ:
Как проверить, есть ли у HTML-элемента определённый класс с помощью JavaScript?
Для проверки класса у элемента используется свойство classList. У каждого DOM-элемента есть объект classList, который содержит методы для работы с классами. Например, чтобы узнать, есть ли у элемента класс 'active', можно использовать element.classList.contains('active'). Метод возвращает true, если класс присутствует, и false, если отсутствует.
Можно ли проверять класс у элемента без использования classList?
Да, класс можно проверить через свойство className, которое содержит строку с именами всех классов элемента. Например, element.className.includes('active') вернёт true, если класс 'active' присутствует. Но этот способ менее точный, так как он может вернуть совпадение части слова, а classList.contains проверяет только полное имя класса.
Что произойдёт, если попытаться проверить класс у элемента, которого нет в DOM?
Если переменная, которая должна содержать элемент, равна null или undefined, вызов element.classList.contains('some-class') приведёт к ошибке TypeError. Чтобы этого избежать, сначала проверяют существование элемента: if (element && element.classList.contains('some-class')) { ... }. Это гарантирует, что метод contains вызывается только у настоящего элемента.
Можно ли проверить сразу несколько классов у одного элемента?
Метод classList.contains проверяет только один класс за раз. Если нужно проверить несколько, можно использовать несколько вызовов или объединить их через логические операторы. Например, element.classList.contains('active') && element.classList.contains('highlight') вернёт true только если оба класса присутствуют. Также можно перебрать массив классов с помощью цикла и проверить каждый.
