Unpoly — это JavaScript-библиотека, предназначенная для постепенного обновления частей веб-страницы без полной перезагрузки. Ключевой концепцией является контекст, который определяет область DOM, подвергающуюся изменению после выполнения действия (например, клика по ссылке или отправки формы).
Контекст задается с помощью CSS-селектора и позволяет ограничить область воздействия Unpoly. Основные механизмы обновления контекста основаны на директивах, передаваемых через HTML-атрибуты или JavaScript-методы.
Контекст задается через атрибут up-target на элементе.
Этот атрибут указывает, какая часть страницы должна быть обновлена при
выполнении действия:
<a href="/posts/42" up-target="#post-42">Редактировать</a>
В данном примере при клике на ссылку будет обновлён элемент с
id="post-42". Unpoly автоматически подгружает новый
HTML-фрагмент и вставляет его в указанный контейнер.
Если up-target не указан, контекст определяется
ближайшим контейнером с классом up-target или по умолчанию
применяются глобальные настройки.
Unpoly поддерживает вложенные контексты, что позволяет обновлять элементы внутри других элементов, уже управляемых Unpoly. Например:
<div id="comments">
<div class="comment" id="comment-1">
<a href="/comments/1/edit" up-target=".comment">Редактировать</a>
</div>
</div>
При клике на ссылку будет обновлён только элемент с классом
.comment внутри контейнера #comments.
Динамический контекст позволяет задавать селекторы через Jav * aScript:
up.click('#dynamic-link', { target: '#dynamic-container' });
Здесь контекст определяется в момент вызова метода, что особенно удобно при работе с элементами, создаваемыми динамически после загрузки страницы.
Unpoly позволяет управлять способом вставки нового контента:
replace) — новый HTML
полностью заменяет старый контейнер:<div id="post-42" up-target="this" up-replace>
...
</div>
prepend /
append) — позволяет добавлять элементы в существующий
контейнер:<ul id="comments">
<li up-target="#comments" up-append>
Новый комментарий
</li>
</ul>
before /
after) — используется для позиционного добавления контента
относительно существующего элемента.Эти стратегии позволяют гибко управлять структурой страницы без полной перезагрузки, минимизируя пересоздание DOM.
Unpoly обеспечивает события жизненного цикла, которые привязаны к обновлению контекста:
up:fragment:loaded — фрагмент HTML успешно загружен и
вставлен.up:fragment:revealed — новый контент стал видимым.up:fragment:removed — старый контент был удалён после
замены.Пример использования:
up.on('up:fragment:loaded', '#post-42', function(event) {
console.log('Контент обновлён', event.fragment);
});
События можно использовать для повторной инициализации плагинов или привязки обработчиков к новым элементам внутри обновлённого контекста.
Unpoly позволяет изолировать обновления, чтобы изменения в одном
контейнере не затрагивали другие. Для этого используются атрибуты
up-scope и up-target вместе:
<div id="sidebar" up-scope>
<a href="/menu" up-target="#menu">Обновить меню</a>
</div>
up-scope ограничивает область поиска целей и
событий.up-target указывает точку обновления внутри этой
области.Это особенно полезно при работе с модальными окнами и динамическими панелями, где требуется локализованное обновление.
Формы в Unpoly автоматически используют контекст для обновления результата отправки. Пример:
<form action="/posts" method="post" up-target="#posts-list">
<input name="title">
<button type="submit">Добавить</button>
</form>
После отправки формы содержимое контейнера #posts-list
будет обновлено новым списком постов.
Можно комбинировать стратегии вставки и обработку ошибок:
<form action="/comments" method="post" up-target="#comments" up-append>
<input name="body">
<button type="submit">Отправить</button>
</form>
В этом случае новый комментарий добавляется в конец списка, не трогая существующие элементы.
Unpoly поддерживает рекурсивное обновление: новый фрагмент может
содержать элементы с собственными up-target. В этом случае
происходит каскадная замена, где каждый элемент
обновляется в соответствии с заданным контекстом, а события жизненного
цикла вызываются для каждого фрагмента отдельно.
up-target во
избежание конфликтов.up-scope для изоляции
областей.replace,
append, prepend) для эффективного управления
DOM.Эти принципы позволяют строить быстрые и отзывчивые интерфейсы с минимальными затратами на обновление всей страницы.