Umbrella JS предоставляет компактный набор методов для работы с DOM, вдохновлённый концепциями jQuery, но без избыточной сложности. Одной из характерных особенностей является возможность одновременно использовать удобство цепочек Umbrella и возвращаться к нативным DOM-элементам, когда требуется прямой доступ к стандартному API браузера.
Результатом вызова u(selector) является объект-обёртка,
содержащий массив найденных узлов. Эта коллекция не прячет DOM-элементы
и не создаёт собственный тип дерева, что облегчает взаимодействие c
браузерными методами.
Пример структуры коллекции:
u('div').nodes -> [HTMLDivElement, HTMLDivElement, ...]
Главная мысль: коллекция Umbrella — это удобный слой над нативными элементами, а не их подмена.
.nodes как
мост к DOMДля извлечения «сырых» элементов используется свойство
.nodes. Оно содержит обычный массив DOM-узлов без прокси,
расширений или дополнительных методов. Это позволяет свободно применять
стандартные свойства и функции браузера.
const boxes = u('.box').nodes;
boxes.forEach(el => el.classList.add('highlight'));
Такой подход полезен при работе с нестандартными API, сторонними библиотеками или функциональностью, не покрытой методами Umbrella.
При обращении к первому элементу коллекции применяется индекс:
const first = u('.item').nodes[0];
first.style.display = 'none';
Umbrella не навязывает собственный способ выделения одного узла и не преобразует выборку в момент обращения. Это снижает когнитивную нагрузку и сохраняет интуитивность JavaScript-подхода.
Коллекция не маскирует массив и не требует специальных адаптеров.
Доступны методы map, filter,
slice, а также деструктуризация:
const [a, b] = u('button').nodes;
Подобная прозрачность делает интеграцию с функциональным стилем JavaScript естественной и прямолинейной.
Часто удобно комбинировать операции. Например, подготовка элементов средствами Umbrella, а затем точечное управление через DOM:
const links = u('a')
.addClass('interactive')
.nodes;
links.forEach(el => el.setAttribute('target', '_blank'));
Umbrella отвечает за декларативные изменения коллекции, а DOM — за специфические настройки каждого узла.
Когда требуется использование UI-фреймворков или утилит, принимающих
только HTMLElement, свойство .nodes исключает
необходимость разворачивать коллекцию вручную. Отсутствие билингвы между
типами данных упрощает компоновку приложений.
thirdPartyWidget(u('#chart').nodes[0]);
Несмотря на наличие собственных методов событий, прямое подключение
обработчиков через addEventListener остаётся возможным и
иногда предпочтительным:
const el = u('.panel').nodes[0];
el.addEventListener('transitionend', onEnd);
Umbrella не перехватывает и не модифицирует механизм событий, позволяя использовать браузерные возможности без компромиссов.
Если элемент был получен или создан нативным способом, его можно вновь обернуть в Umbrella:
const el = document.createElement('div');
u(el).addClass('box');
Также допускается передача массивов и NodeList, что
обеспечивает симметричность API:
u(document.querySelectorAll('.row')).addClass('active');
Комбинация Umbrella и DOM удобна для контекстных выборок. Например, извлечение вложенных узлов через нативные методы и дальнейшая обработка в Umbrella:
const root = u('#root').nodes[0];
u(root.querySelectorAll('span')).toggleClass('selected');
Поддерживается цепочка от глобального документа к локальному дереву и обратно.
Возврат к DOM-узлам исключает лишнюю аллокацию объектов и снижает расход памяти при массовых операциях. В отличие от тяжёлых обёрток, Umbrella минимизирует накладные расходы и не внедряет скрытые слои. Это делает библиотеку подходящей для высоконагруженных интерфейсов с обилием дом-манипуляций.
Umbrella JS подчёркивает идею «минимального расстояния» между разработчиком и DOM. Отсутствие «магии», лёгкий доступ к нативным элементам и совместимость с экосистемой браузера формируют подход, где библиотека расширяет возможности, не скрывая фундаментального API JavaScript.