Unpoly — это библиотека для создания динамических пользовательских интерфейсов на основе существующих серверных страниц, которая делает акцент на плавную замену фрагментов страницы без полной перезагрузки. Одной из ключевых задач при работе с Unpoly является обеспечение обратной совместимости с классическим HTML и существующим JavaScript-кодом.
Обратная совместимость гарантирует, что даже при внедрении Unpoly старые ссылки, формы и скрипты продолжают работать, а новые возможности динамической подгрузки фрагментов не ломают существующую логику.
Unpoly автоматически перехватывает клики по ссылкам и отправку форм, чтобы заменить часть страницы на серверный ответ. При этом сохраняется стандартное поведение для случаев, когда Unpoly не может обработать запрос:
<a href="/profile" up-target="#content">Профиль</a>
<form action="/update" method="post" up-target="#content">
<input type="text" name="name">
<button type="submit">Обновить</button>
</form>
up-target указывает элемент,
который будет обновлён.up-target не указан, Unpoly заменяет
<body> целиком, но при этом обычная загрузка страницы
остаётся возможной.up-keep к
форме или ссылке.<a href="/legacy" up-keep>Старая страница</a>
Ключевой момент: Unpoly не ломает существующие серверные эндпоинты. Сервер возвращает обычный HTML, и если Unpoly не активен, контент загружается стандартным образом.
При подгрузке фрагментов через Unpoly важно учитывать, что скрипты
внутри загружаемых элементов не выполняются
автоматически, если они подключены через
<script> в HTML. Для обратной совместимости
существуют следующие механизмы:
up:fragment:loaded и
up:content:loaded — позволяют привязывать
обработчики к вновь подгруженным элементам без изменения существующих
функций.up.on('up:fragment:loaded', function(event) {
console.log('Фрагмент загружен:', event.target);
});
up.evaluateScripts —
позволяет явно выполнить скрипты из подгруженного фрагмента:up.fragment.load('/fragment', { target: '#container', evaluateScripts: true });
addEventListener или jQuery. Unpoly не
удаляет существующие элементы, а лишь заменяет их при
необходимости.Обратная совместимость включает поддержку пользователей без JS и поисковых систем:
up-href может использоваться
для указания URL, к которому нужно обратиться при загрузке фрагмента,
без изменения стандартного href.<a href="/full-page" up-href="/partial">Частичная подгрузка</a>
X-Up-Target в
заголовках).Unpoly интегрируется с History API, но при этом сохраняет обратную совместимость:
up-target ведут себя как
обычные переходы.up-history:<a href="/page" up-target="#main" up-history>Перейти</a>
Unpoly построен по принципу прогрессивного улучшения:
Примеры обратной совместимости:
Unpoly позволяет работать с вложенными фрагментами, сохраняя старый код:
up-target с up-keep
для защиты определённых элементов от перерисовки.<div id="sidebar" up-keep>
<!-- Содержимое не будет заменяться -->
</div>
<div id="main" up-target>
<!-- Загружаемый фрагмент -->
</div>
up-cache.up.cache.set('/fragment', document.querySelector('#main').innerHTML);
up-target для динамических
обновлений.up-keep для элементов, которые не должны
заменяться.up.on для работы
с подгружаемыми фрагментами.Эти правила позволяют плавно интегрировать Unpoly в существующие проекты без риска нарушить старый функционал и обеспечивают совместимость с любыми браузерами и пользовательскими сценариями.