Библиотека Page.js обеспечивает управление маршрутами на клиентской стороне, создавая одностраничное приложение без перезагрузки страницы. Иногда возникает необходимость игнорировать определенные ссылки, чтобы они обрабатывались обычным образом браузером, а не через маршрутизатор.
data-no-routingОдним из распространенных подходов является добавление атрибута
data-no-routing к ссылкам, которые должны игнорироваться.
Page.js предоставляет возможность настроить фильтрацию таких ссылок
перед обработкой маршрутов.
<a href="/external" data-no-routing>Внешняя ссылка</a>
<a href="/internal">Внутренняя страница</a>
page('*', (ctx, next) => {
const links = document.querySelectorAll('a[data-no-routing]');
links.forEach(link => {
link.addEventListener('click', (event) => event.stopPropagation());
});
next();
});
page();
В данном примере события клика по ссылкам с
data-no-routing не передаются
маршрутизатору, поэтому браузер выполняет переход стандартным
образом.
page.skipPage.js позволяет явно пропускать маршруты с помощью метода
page.skip. Это удобно, если нужно игнорировать определенные
URL или паттерны ссылок.
page('*', (ctx, next) => {
if (ctx.path.startsWith('/external')) {
return page.skip();
}
next();
});
page();
В данном коде все ссылки, начинающиеся с /external,
будут обрабатываться браузером напрямую, а остальные
маршруты будут попадать под обработку Page.js.
Можно настроить глобальный фильтр для ссылок, используя селекторы CSS. Это особенно полезно при большом количестве ссылок на странице, где часть из них должна оставаться вне контроля маршрутизатора.
document.addEventListener('click', function(event) {
const target = event.target.closest('a');
if (!target) return;
if (target.matches('.ignore-pagejs')) {
return; // переход происходит стандартным образом
}
event.preventDefault();
page(target.getAttribute('href'));
});
<a href="/internal" class="ignore-pagejs">Игнорируемая ссылка</a>
<a href="/dashboard">Поддерживаемая Page.js ссылка</a>
Здесь используется делегирование событий, что
повышает производительность при динамически создаваемых ссылках. Ссылки
с классом .ignore-pagejs игнорируются Page.js.
Page.js рекомендуется использовать только для внутренних маршрутов SPA. Ссылки на внешние сайты или файлы стоит игнорировать, чтобы не нарушать привычное поведение браузера:
document.addEventListener('click', function(event) {
const link = event.target.closest('a');
if (!link) return;
const href = link.getAttribute('href');
if (!href || href.startsWith('http') || href.endsWith('.pdf')) {
return; // игнорируем внешние ресурсы и файлы
}
event.preventDefault();
page(href);
});
Данный подход предотвращает вмешательство Page.js в переходы на сторонние сайты или скачивание файлов.
При использовании Ctrl+Click, Cmd+Click или Shift+Click пользователь ожидает открыть ссылку в новой вкладке. Эти события также должны игнорироваться:
document.addEventListener('click', function(event) {
const link = event.target.closest('a');
if (!link) return;
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
return; // стандартное поведение
}
event.preventDefault();
page(link.getAttribute('href'));
});
Это гарантирует сохранение привычного поведения браузера при открытии ссылок в новых вкладках или окнах.
На практике удобно комбинировать несколько методов фильтрации:
data-no-routing).document.addEventListener('click', function(event) {
const link = event.target.closest('a');
if (!link) return;
const href = link.getAttribute('href');
if (
link.hasAttribute('data-no-routing') ||
!href ||
href.startsWith('http') ||
href.endsWith('.pdf') ||
event.metaKey || event.ctrlKey || event.shiftKey || event.altKey
) {
return; // переход происходит стандартно
}
event.preventDefault();
page(href);
});
Такой подход обеспечивает гибкость, позволяя Page.js обрабатывать только те маршруты, которые действительно относятся к SPA, без вмешательства в работу обычных ссылок.
page.skip() — эффективен для
URL-паттернов.Использование этих стратегий позволяет строить SPA с Page.js, где маршрутизатор отвечает только за внутренние переходы, а остальные ссылки остаются полностью стандартными.