Shepherd.js — это библиотека для создания интерактивных руководств
(tours) в веб-приложениях. Основная концепция строится на
последовательности шагов (steps), каждый из которых
может содержать заголовок, описание и управляющие элементы (кнопки).
Каждый шаг привязывается к конкретному элементу DOM через селектор
attachTo. Понимание структуры шагов и их жизненного цикла
критично для диагностики проблем.
const tour = new Shepherd.Tour({
defaultStepOptions: {
cancelIcon: { enabled: true },
classes: 'shepherd-theme-arrows',
scrollTo: { beh * avior: 'smooth', block: 'center' }
}
});
tour.addStep({
id: 'intro',
text: 'Добро пожаловать в приложение!',
attachTo: { element: '#start-btn', on: 'bottom' },
buttons: [
{ text: 'Далее', action: tour.next }
]
});
tour.start();
Наиболее частая причина сбоев Shepherd.js — это отсутствие элемента на странице в момент создания шага. Если элемент не существует, шаг не отобразится, а иногда вызывает ошибку.
Диагностика:
attachTo.element.tour.start().setTimeout или
MutationObserver).const observer = new MutationObserver(() => {
if (document.querySelector('#start-btn')) {
tour.start();
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
Shepherd.js использует CSS-классы для позиционирования и анимации подсказок. Неправильные или конфликтующие стили могут привести к тому, что подсказка будет скрыта или позиционироваться неверно.
Методы диагностики:
getBoundingClientRect()..shepherd-step и .shepherd-tooltip.shepherd-theme-arrows,
shepherd-theme-default) для выявления конфликтов.const stepElement = document.querySelector('.shepherd-step');
console.log(stepElement?.getBoundingClientRect());
Shepherd.js предоставляет события жизненного цикла:
show, hide, cancel,
complete. Иногда шаги не отображаются из-за
неправильного управления событиями.
Проверка:
next() и back()
вызываются корректно.tour.on('start', () => console.log('Тур начался'));
tour.on('complete', () => console.log('Тур завершён'));
tour.addStep({
id: 'step1',
text: 'Первый шаг',
buttons: [
{
text: 'Следующий',
action: function() {
console.log('Нажата кнопка Далее');
tour.next();
}
}
]
});
Если шаги зависят от данных, загружаемых асинхронно, подсказка может появиться слишком рано или не появиться вовсе.
Стратегии диагностики:
async/await перед
добавлением шага.tour.start() до завершения загрузки
данных.async function initTour() {
await fetchData(); // Асинхронная загрузка данных
tour.addStep({ id: 'data-step', text: 'Данные загружены', attachTo: { element: '#data', on: 'top' } });
tour.start();
}
Для диагностики всех проблем рекомендуется включить детальное логирование:
tour.steps.forEach(step => {
step.on('show', () => console.log(`Показан шаг ${step.id}`));
step.on('hide', () => console.log(`Скрыт шаг ${step.id}`));
});
setTimeout без контроля состояния
DOM.MutationObserver) или промисы для гарантии наличия
элементов.Эти подходы позволяют локализовать и устранить большинство проблем Shepherd.js, связанных с отображением, привязкой к элементам и асинхронным поведением.