Umbrella JS — лёгкая библиотека для работы с DOM, обеспечивающая удобный синтаксис и высокую читаемость кода. Одной из ключевых особенностей является гибкость методов, которая позволяет их комбинировать и использовать совместно с нативными функциями JavaScript, однако при этом важно понимать ограничения совместимости между различными методами.
Umbrella JS поддерживает цепочку вызовов, что
позволяет применять несколько методов к одному набору элементов. Каждый
метод возвращает объект u(), что обеспечивает совместимость
с последующими вызовами:
u('.item')
.addClass('active')
.attr('data-role', 'button')
.css('color', 'red');
Важный момент: не все методы возвращают объект
u(). Например, методы получения значений
(.html(), .text(), .val())
возвращают строку или значение, поэтому цепочка после них
невозможна:
let content = u('.item').html(); // Возвращает HTML, дальше цепочка невозможна
Umbrella JS предоставляет методы для обхода элементов:
.parent().children().siblings().closest().find()Эти методы возвращают новый объект u(),
поэтому они полностью совместимы с большинством других методов Umbrella
JS:
u('.item')
.parent()
.addClass('highlight')
.children()
.css('background', 'yellow');
Важно учитывать, что методы типа .parent() возвращают
первый уровень родителей, а .closest() —
ближайший подходящий элемент по селектору. Попытка применять методы,
ожидающие коллекцию элементов, к одному элементу не вызывает ошибки, но
может дать неожиданный результат, если не контролировать выборку.
Методы .attr(), .removeAttr(),
.prop(), .removeProp() полностью совместимы с
большинством методов изменения стилей и классов, поскольку всегда
возвращают объект u():
u('input[type="text"]')
.attr('placeholder', 'Введите текст')
.addClass('input-active')
.css('border', '1px solid blue');
Методы получения атрибутов (.attr('name')) возвращают
строку или null, поэтому их нельзя использовать в
цепочке с методами модификации элементов без создания новой выборки:
let nameAttr = u('input').attr('name'); // Получает значение
// u('input').attr('name').addClass('active'); <- ошибка
Методы работы с классами:
.addClass().removeClass().toggleClass().hasClass()возвращают объект u(), кроме .hasClass(),
который возвращает булево значение. Это означает, что
.hasClass() нарушает цепочку:
u('.item').addClass('visible').removeClass('hidden'); // Работает
let hasVisible = u('.item').hasClass('visible'); // true/false
Для сохранения цепочки после проверки класса необходимо использовать отдельную выборку:
if (u('.item').hasClass('visible')) {
u('.item').css('color', 'green');
}
Методы .html(), .text(),
.val():
u(), совместимы с цепочкой.Пример установки:
u('#title').html('<strong>Заголовок</strong>').css('color', 'blue');
Пример получения:
let value = u('#input').val(); // Возвращает значение input
Методы .on(), .off(),
.trigger() возвращают объект u(), что
позволяет комбинировать их с другими методами:
u('.button')
.on('click', () => console.log('Клик'))
.addClass('clickable')
.css('cursor', 'pointer');
Особенность: .on() поддерживает множественные
события через пробел, а .off() — аналогично, что
упрощает совместное использование с другими методами изменения
элементов.
.remove().empty()возвращают объект u(), однако после удаления элементы
больше не присутствуют в DOM, поэтому последующие методы, ожидающие
выборку этих элементов, не оказывают эффекта:
u('.item').remove().addClass('deleted'); // .addClass() не будет работать
Umbrella JS полностью совместим с нативными методами
Node, Element и NodeList при
получении элементов:
u('.item')[0].innerHTML = 'Новый контент'; // Использование нативного DOM
u('.item').each(el => el.style.color = 'red'); // Применение нативного свойства
Метод .each() возвращает объект u() и может
использоваться для обхода коллекции перед применением любых других
методов.
u(), можно цеплять
без ограничений..each() позволяет работать с нативными
методами DOM внутри цепочек Umbrella JS.Совместимость методов Umbrella JS строится на простом принципе:
каждый метод, возвращающий объект u(),
интегрируется в цепочку, а методы получения данных — возвращают
конкретное значение и требуют отдельной обработки. Это делает библиотеку
легкой, но требует внимательного подхода при построении сложных цепочек
вызовов.