Shepherd.js предоставляет мощный механизм для организации пользовательских туров по веб-приложениям, который базируется на концепции шагов (steps) и их событий (events). Ключевым компонентом управления поведением туров является Observer, позволяющий реагировать на изменения состояния шагов и самого тура. Observer реализуется через систему подписки на события и обеспечивает гибкую настройку логики в зависимости от действий пользователя.
Shepherd.js генерирует широкий набор событий, на которые можно подписываться. Они делятся на два уровня:
События тура (Tour events) – глобальные события, связанные с самим туром:
start – запуск тура.cancel – отмена тура пользователем.complete – успешное завершение тура.show – показ любого шага тура.hide – скрытие текущего шага.inactive – тур неактивен, например, после завершения
или отмены.События шага (Step events) – локальные события, привязанные к конкретному шагу:
show – шаг отображён на экране.hide – шаг скрыт.complete – шаг завершён пользователем.cancel – шаг был отменён.active – шаг активен и готов к взаимодействию.Эти события являются основой для построения наблюдателей (Observer), которые позволяют динамически реагировать на изменения.
Для подписки на события используется метод .on() объекта
тура. Пример:
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-arrows',
scrollTo: true
}
});
tour.addStep({
id: 'intro',
text: 'Добро пожаловать в тур!',
attachTo: { element: '#start-button', on: 'bottom' }
});
tour.on('start', () => {
console.log('Тур начат');
});
tour.on('complete', () => {
console.log('Тур успешно завершён');
});
tour.start();
В этом примере Observer подписан на события start и
complete, что позволяет выполнять произвольный код при
начале и завершении тура.
Для отслеживания событий конкретного шага используется аналогичный синтаксис:
const step = tour.addStep({
id: 'feature-step',
text: 'Это важная функция приложения.',
attachTo: { element: '#feature', on: 'top' }
});
step.on('show', () => {
console.log('Шаг feature-step отображён');
});
step.on('hide', () => {
console.log('Шаг feature-step скрыт');
});
Подписка на события шага позволяет интегрировать динамическое поведение, например, запуск анимаций, изменение состояния интерфейса или отслеживание прогресса пользователя.
Observer может использоваться для условного управления логикой тура. Например, можно пропускать шаги, если пользователь уже выполнил определённое действие:
tour.on('show', (event) => {
if (event.step.id === 'optional-step' && localStorage.getItem('skipStep')) {
tour.next();
}
});
Здесь проверяется идентификатор текущего шага и состояние локального хранилища, чтобы пропустить шаг при определённом условии.
Shepherd.js поддерживает множественные подписки на одно и то же событие. Это позволяет строить сложные цепочки реакций:
tour.on('show', (event) => console.log('Показан шаг:', event.step.id));
tour.on('show', (event) => {
if (event.step.id === 'important-step') {
highlightElement('#important-feature');
}
});
Каждый Observer будет выполняться независимо, что облегчает модульное проектирование поведения туров.
Чтобы Observer не оставались активными после завершения тура, их
можно удалять с помощью метода .off():
const logStart = () => console.log('Тур начат');
tour.on('start', logStart);
// Позже, если нужно отписаться
tour.off('start', logStart);
Это предотвращает накопление ненужных обработчиков и утечки памяти при длительных сессиях.
Все события Shepherd.js передают объект с контекстной информацией.
Для шагов это объект с полем step, а для тура – объект с
полем tour. Это позволяет обращаться к свойствам и методам
шага или тура внутри Observer:
tour.on('show', (event) => {
console.log('Активный шаг:', event.step.options.id);
});
Использование контекста делает Observer мощным инструментом для адаптивных интерфейсов и интерактивных туров.
Observer позволяет вызывать любые пользовательские функции, что делает Shepherd.js гибким для сложных сценариев. Например:
tour.on('complete', () => {
sendAnalyticsEvent('tour_completed');
});
Таким образом, Observer выступает связующим звеном между событиями Shepherd.js и внешними системами: аналитикой, логикой приложения, визуальными эффектами.
.off() для удаления Observer после
завершения тура или шага.Использование Observer в Shepherd.js обеспечивает полное управление жизненным циклом тура и шагов, позволяя строить интерактивные и динамичные обучающие сценарии, полностью интегрированные с функционалом веб-приложения.