Unpoly — это легковесная библиотека для улучшения интерфейсов веб-приложений через динамическую замену содержимого страниц без полной перезагрузки. В основе лежит принцип частичной замены HTML, где отдельные фрагменты DOM обновляются по событиям, связанным с действиями пользователя. Библиотека полностью управляет историей браузера, обработкой форм и навигацией, сохраняя асинхронность и плавность интерфейса.
Ключевым понятием является целевая область
(target), в которую вставляется полученный HTML.
Любой вызов замены — это комбинация URL запроса,
селектора цели и опций анимации.
up.replace()Метод up.replace() выполняет асинхронный HTTP-запрос и
обновляет указанный фрагмент страницы.
Синтаксис:
up.replace(url, target, options)
url — адрес ресурса для загрузки.target — CSS-селектор элемента, который будет
заменён.options — объект с настройками запроса и анимации.Пример:
up.replace('/users/42', '#profile', { animation: 'fade' });
Этот код загружает HTML с /users/42 и плавно заменяет
содержимое элемента с id profile.
Основные возможности options:
animation — тип анимации (fade,
slide, none).scroll — прокрутка к элементу после замены
(true, селектор или координата).focus — установка фокуса на элемент после вставки.history — управление историей браузера
(true добавляет запись).Unpoly автоматически интегрируется с формами, позволяя отправлять их
через AJAX без полной навигации. Для этого используется
up.submit():
up.submit(form, target, options)
form — элемент формы или селектор.target — элемент для замены содержимого.options — аналогично up.replace().Пример:
up.submit('#edit-user-form', '#profile', { animation: 'slide' });
Форма будет отправлена асинхронно, а возвращённый HTML заменит
содержимое #profile с анимацией скольжения.
Unpoly автоматически управляет статусом кнопок отправки, показывает
ошибки и позволяет вставлять фрагменты ответа в указанные области через
атрибут up-target.
Unpoly поддерживает множество атрибутов, которые делают интеграцию декларативной:
up-target — задаёт элемент для замены.up-method — HTTP-метод (GET,
POST).up-transition — анимация при вставке.up-swap — стратегия вставки: replace,
before, after, prepend,
append.up-confirm — текст подтверждения перед выполнением
действия.Пример кнопки:
<button
up-target="#comments"
up-swap="prepend"
up-transition="fade"
up-method="POST"
up-confirm="Добавить комментарий?">
Добавить комментарий
</button>
При клике комментарий будет добавлен в начало контейнера
#comments с плавным эффектом.
При замене фрагментов Unpoly автоматически обновляет историю браузера, что позволяет использовать кнопки “Назад” и “Вперед”. Встроенные события:
up:request — перед отправкой запроса.up:success — при успешной замене.up:failure — при ошибке запроса.up:layer:opened / up:layer:closed — для
работы с модальными слоями.Пример с отслеживанием события:
up.on('up:success', '#profile', function(event) {
console.log('Профиль обновлён:', event.target);
});
Unpoly поддерживает несколько встроенных анимаций:
fade — плавное появление.slide — скольжение вверх/вниз.cross-fade — одновременное исчезновение старого и
появление нового содержимого.Анимации можно комбинировать с опциями scroll и
focus для создания интуитивного интерфейса. Например:
up.replace('/dashboard', '#main', { animation: 'cross-fade', scroll: '#top', focus: true });
Unpoly позволяет загружать не весь HTML, а конкретные фрагменты, используя CSS-селекторы на стороне сервера:
up.replace('/users/42 #contact-info', '#contact-info');
В этом случае из ответа будет извлечён только блок
#contact-info и вставлен в одноимённый элемент на
странице.
Unpoly предоставляет слои (layers),
которые позволяют отображать содержимое поверх страницы без замены
основного контента. Это полезно для модальных окон, всплывающих форм и
диалогов.
up.layer.open('/users/42/edit', { animation: 'slide' });
Содержимое загрузится в отдельный слой, который можно закрывать, не влияя на основной DOM.
Система событий Unpoly позволяет реагировать на каждую фазу загрузки:
up:loading — начинается запрос.up:loaded — контент загружен в DOM.up:inserted — новый элемент вставлен и виден.up:removed — элемент удалён.Пример отслеживания вставки:
up.on('up:inserted', '#messages', function(event) {
event.target.scrollTop = event.target.scrollHeight;
});
Unpoly оптимизирован для минимизации операций с DOM. Основные подходы:
Использование этих принципов позволяет строить интерактивные страницы, где пользовательский опыт приближен к нативным приложениям без сложных SPA-фреймворков.