Проверка существования элементов

Библиотека Umbrella JS предоставляет удобный минималистичный интерфейс для работы с DOM. Одной из частых задач является определение того, существуют ли выбранные элементы и можно ли к ним применять дальнейшие операции. В отличие от полноценного фреймворка, Umbrella JS не вводит собственных типов null или undefined для отсутствующих узлов, а опирается на длину коллекции и ряд вспомогательных методов.

Основной принцип проверки

Функция выбора u(selector) возвращает объект-коллекцию, содержащий найденные элементы. Отсутствие совпадений означает, что коллекция пуста. Ключевой индикатор — свойство length. Значение 0 определяет отсутствие элементов, любое положительное число — успешный выбор.

Пример проверки:

if (u('.item').length > 0) {
    /* элементы существуют */
}

Umbrella JS допускает цепочки методов, и многие операции автоматически возвращают пустую коллекцию при отсутствии совпадений. Это позволяет безопасно совмещать выборку с фильтрацией или наведением событий, однако иногда требуется прямое условие.

Метод is() как дополнительная проверка

Метод is() позволяет определить, соответствует ли коллекция указанному селектору. В случае пустой выборки результат всегда будет false, что фактически даёт косвенную проверку существования:

if (u('.item').is('.item')) {
    /* есть хотя бы один элемент */
}

Однако основной и наиболее прозрачно читаемый механизм — проверка длины.

Логическая интерпретация коллекции

Объект, возвращаемый Umbrella JS, не приводится к булевому значению напрямую так, чтобы пустая коллекция интерпретировалась как false. Логическое преобразование будет всегда истинным, поскольку это объект. Поэтому idiomatic-подход, используемый в некоторых других библиотеках, здесь не работает:

if (u('.item')) {
    /* не гарантирует наличие элементов */
}

Для корректного условия следует проверять length.

Обработка динамических случаев

В задачах, связанных с динамически добавляемыми или удаляемыми элементами, проверка наличия может выполняться перед привязкой событий или применением манипуляций к DOM. Например, перед использованием addClass(), html(), on() и других методов стоит убедиться, что выборка не пустая.

const items = u('.item');
if (items.length) {
    items.addClass('active');
}

Umbrella JS не выбрасывает исключения при попытке выполнить методы над пустой коллекцией, но и эффекта от операции не будет. Именно поэтому проверка существования удобна для контроля бизнес-логики или визуальных состояний.

Цепочные методы и пустые коллекции

Особенность Umbrella JS заключается в том, что цепочки методов продолжают возвращать объект-коллекцию вне зависимости от наличия элементов. Это означает, что можно безопасно строить цепочки, но конечный эффект окажется нулевым, если выборка пуста. Такой подход хорошо подходит для лаконичных манипуляций, но при необходимости ветвления логики применяется проверка length.

u('.item')
  .addClass('selected')
  .html('Готово');

Если .item отсутствует, код выполнится без ошибок, но без изменений в DOM. Для осмысленного контроля применяется явная проверка существования.

Использование filter() и first() для уточнения условий

Методы filter() и first() применяются для сокращения выборки и могут возвращать пустую коллекцию при отсутствии совпадений. В таких случаях длина коллекции — снова главный инструмент проверки.

const firstItem = u('.item').first();
if (firstItem.length) {
    firstItem.addClass('highlight');
}

Такая практика характерна для операций выделения одного элемента.

Взаимодействие с полученными узлами

Иногда требуется проверить не только факт наличия элементов, но и доступность конкретного DOM-узла. Обращение к элементу по индексу возможно через nodes, массивоподобное свойство коллекции:

const el = u('.item').nodes[0];
if (el) {
    el.setAttribute('data-state', 'ready');
}

Здесь проверка происходит уже на уровне нативного DOM, что может быть полезно в интеграциях с кодом без Umbrella JS.

Проверка существования при присвоениях и вставках

Для операций вставки содержимого (append, prepend, before, after) Umbrella JS также не порождает ошибок при отсутствии узлов, но вставка будет проигнорирована. Это может привести к скрытым логическим ошибкам, поэтому контроль наличия элементов до вызова таких методов улучшает предсказуемость поведения.

Сравнение с другими библиотеками

В отличие от jQuery, которая допускает использование конструкции вида if ($('.item').length), Umbrella JS использует тот же принцип, что делает перенос логики понятным и предсказуемым. Однако отсутствуют некоторые дополнительные методы для проверки наличия элементов напрямую, что сохраняет библиотеку лёгкой и минималистичной.

Ключевые тезисы

  • Основа проверки существования — свойство length.
  • Пустая коллекция не вызывает ошибок при цепочках, но не оказывает эффекта.
  • Логическое преобразование коллекции всегда истинно, поэтому оно не подходит для проверки наличия.
  • Методы filter(), first() и другие могут возвращать пустую коллекцию и нуждаются в проверке длины.
  • При интеграции с нативным DOM удобна проверка по nodes[index].

Такая модель делает работу с Umbrella JS безопасной при манипуляциях с DOM и позволяет контролировать поведение кода в динамических интерфейсах без лишних проверок и исключений.