Shepherd.js предоставляет гибкий API для создания интерактивных пошаговых инструкций. Расширения (Extensions) позволяют модифицировать поведение туров, шагов и элементов интерфейса без изменения исходного кода библиотеки. В основе работы расширений лежат события и методы жизненного цикла тура и шагов, которые можно перехватывать, изменять или дополнять.
Расширения реализуются через объект конфигурации, передаваемый при создании тура:
const tour = new Shepherd.Tour({
defaults: {
classes: 'shepherd-theme-arrows',
scrollTo: true
},
useModalOverlay: true,
extensions: [MyCustomExtension]
});
Каждое расширение должно иметь структуру с методами жизненного цикла, которая позволяет интегрироваться с внутренними событиями Shepherd.
1. initialize(tour) Вызывается при
инициализации тура. Позволяет добавить дополнительные свойства к объекту
тура или зарегистрировать глобальные обработчики событий:
const MyCustomExtension = {
initialize(tour) {
tour.myCustomData = {};
tour.on('show', () => console.log('Шаг показан'));
}
};
2. beforeStep(step) Срабатывает перед
отображением шага. Здесь можно изменять содержимое шага, добавлять
динамические подсказки или контролировать порядок шагов:
beforeStep(step) {
if (step.id === 'intro') {
step.updateStepOptions({
title: 'Приветствие',
text: 'Добро пожаловать в интерактивный тур!'
});
}
}
3. afterStep(step) Вызывается после
отображения шага. Позволяет запускать анимации, трекать метрики или
изменять видимость элементов:
afterStep(step) {
console.log(`Шаг ${step.id} завершён`);
if (step.id === 'form-step') {
document.querySelector('#submit-button').classList.add('highlight');
}
}
4. destroy() Метод вызывается при
завершении тура или его отмене. Здесь удобно удалять обработчики событий
и очищать ресурсы, связанные с расширением:
destroy() {
document.removeEventListener('click', this.clickHandler);
}
Shepherd.js предоставляет богатый набор событий, которые позволяют расширениям вмешиваться в процесс:
start – запуск тураcomplete – завершение тураcancel – отмена тураshow – показ текущего шагаhide – скрытие текущего шагаactive – шаг становится активнымПример добавления обработчиков событий через расширение:
const AnalyticsExtension = {
initialize(tour) {
tour.on('show', step => {
analytics.track('tourStepShown', { stepId: step.id });
});
tour.on('complete', () => analytics.track('tourCompleted'));
}
};
Расширения позволяют динамически модифицировать шаги
на основе состояния приложения или действий пользователя. Методы
updateStepOptions и setContent дают
возможность подменять текст, кнопки или классы:
const DynamicContentExtension = {
beforeStep(step) {
if (step.id === 'feature-step') {
const featureEnabled = checkFeatureFlag();
step.updateStepOptions({
text: featureEnabled ? 'Функция доступна' : 'Функция отключена',
buttons: featureEnabled
? [{ text: 'Продолжить', action: step.next }]
: [{ text: 'Закрыть', action: step.cancel }]
});
}
}
};
Shepherd.js поддерживает использование массива расширений. Они выполняются последовательно, что позволяет строить модульные и повторно используемые решения:
const tour = new Shepherd.Tour({
defaults: { classes: 'shepherd-theme-arrows' },
extensions: [AnalyticsExtension, DynamicContentExtension]
});
tour.addStep({
id: 'feature-step',
text: 'Здесь будет шаг с динамическим содержимым',
attachTo: { element: '#feature', on: 'bottom' }
});
tour.start();
destroy, чтобы предотвратить
утечки памяти.beforeStep, afterStep,
initialize), чтобы повысить читаемость кода.Расширения позволяют превращать Shepherd.js в полностью кастомизированный инструмент для интерактивных туров, где можно управлять поведением каждого шага, интегрировать аналитику и адаптировать визуальные подсказки под динамическое состояние интерфейса.