Библиотека Page.js предоставляет возможность
автоматического перехвата кликов по ссылкам внутри приложения для
реализации клиентского роутинга без перезагрузки страницы. Этот механизм
позволяет превратить обычные <a> элементы в точки
навигации, управляемые JavaScript, что особенно полезно для
одностраничных приложений (SPA).
Автоматический перехват кликов осуществляется с помощью метода:
page();
или более явного включения:
page({ click: true });
По умолчанию Page.js слушает все события
click на документе и проверяет, соответствует ли элемент
<a> правилам маршрутизации. Если соответствие
найдено, библиотека предотвращает стандартное поведение браузера
(event.preventDefault()) и инициирует переход через
внутреннюю систему маршрутов.
Автоматический перехват не срабатывает, если выполняется хотя бы одно из условий:
Ctrl,
Shift, Meta или Alt нажаты во
время клика. Это позволяет пользователю открывать ссылки в новой вкладке
или окне.target: если у ссылки задан
target="_blank" или другой target, Page.js не перехватывает
клик.Эти правила предотвращают случайное перехватывание кликов и сохраняют привычное поведение браузера там, где это важно.
Можно контролировать автоматический перехват с помощью опций:
page({
click: true, // включает перехват кликов
popstate: true // включает обработку истории браузера
});
Для отключения перехвата кликов достаточно указать:
page({ click: false });
Также можно добавлять собственную логику фильтрации ссылок через
функцию page.click:
page.click = function(event) {
const el = event.target.closest('a');
if (!el) return false;
if (el.classList.contains('no-pagejs')) return false;
return true;
};
Page.js использует делегирование событий, привязывая
обработчик к document. Это означает, что динамически
добавленные ссылки также автоматически становятся управляемыми
маршрутизатором. Делегирование обеспечивает:
Page.js корректно обрабатывает клики по ссылкам с:
?query=123)#section1)?query=123#section1)Маршруты в Page.js можно настроить так, чтобы игнорировать хеш или использовать его для навигации внутри страницы. Например:
page('/posts/:id', (ctx) => {
console.log('ID поста:', ctx.params.id);
});
Если ссылка ведет на /posts/42#comments, параметр
id будет корректно равен 42.
Автоматический перехват кликов интегрируется с HTML5 History API. При клике:
event.preventDefault() блокирует стандартную
навигацию.history.pushState() добавляет новый элемент в
историю.Это позволяет пользователю использовать кнопки “Назад” и “Вперед” браузера без потери состояния приложения.
Для сложных случаев можно вручную отключать перехват для отдельных ссылок:
<a href="/admin" oncl ick="return false;">Админка</a>
Или через CSS-класс:
<a href="/login" class="no-pagejs">Войти</a>
И настройка Page.js:
page.click = function(event) {
const el = event.target.closest('a');
return el && !el.classList.contains('no-pagejs');
};
document._self.click и
кастомные функции фильтрации.Эти возможности позволяют создавать плавную навигацию внутри SPA, сохраняя привычное поведение браузера и гибко управляя ссылками.