Shepherd.js — это мощная библиотека для создания интерактивных пошаговых туров по веб-приложению. Одной из ключевых задач при проектировании туров является корректное отображение сообщений об ошибках, чтобы пользователь понимал, что пошло не так, и мог продолжить взаимодействие с интерфейсом.
В Shepherd.js ошибки могут возникать на нескольких уровнях: при инициализации тура, при добавлении шагов, при переходе между шагами или при взаимодействии с элементами страницы, к которым привязаны шаги. Для управления этими ситуациями библиотека предоставляет гибкие механизмы обработки и кастомизации сообщений об ошибках.
При создании объекта тура (Shepherd.Tour) можно
использовать глобальные обработчики ошибок для всех шагов. Например:
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-arrows',
scrollTo: true
},
useModalOverlay: true
});
tour.on('error', function(error) {
console.error('Ошибка тура:', error);
showCustomErrorMessage(error.message);
});
Здесь:
tour.on('error', callback) — глобальный обработчик
ошибок, который срабатывает при возникновении любой ошибки, связанной с
туром.showCustomErrorMessage — кастомная функция для
отображения сообщения пользователю.Такой подход позволяет централизованно обрабатывать ошибки, например, когда шаг не может найти элемент DOM.
Частая причина ошибок — отсутствие элемента на странице, к которому привязан шаг. Shepherd.js не выводит встроенное уведомление, но позволяет проверять доступность элементов:
const step = {
id: 'step-1',
text: 'Нажмите здесь, чтобы продолжить',
attachTo: {
element: '#button-next',
on: 'bottom'
},
beforeShowPromise: function() {
return new Promise((resolve, reject) => {
const el = document.querySelector('#button-next');
if (el) {
resolve();
} else {
reject(new Error('Элемент "#button-next" не найден на странице'));
}
});
}
};
tour.addStep(step);
beforeShowPromise — ключевой механизм для перехвата
потенциальной ошибки до отображения шага.reject можно передавать объект
Error с детальным сообщением.Для более дружественного UX сообщения об ошибках можно отображать внутри модальных оверлеев Shepherd.js или через внешние UI-компоненты.
Пример встроенного сообщения через шаг тура:
tour.addStep({
id: 'error-step',
text: () => {
const error = tour.getCurrentStep().errorMessage;
return error || 'Произошла непредвиденная ошибка';
},
buttons: [
{
text: 'Закрыть',
action: tour.cancel
}
],
beforeShow: function() {
this.errorMessage = 'Не удалось найти нужный элемент';
}
});
text позволяет динамически
подставлять сообщение об ошибке.errorMessage шага хранит текст ошибки и может
быть использовано для логирования или UI.Shepherd.js хорошо сочетается с внешними системами логирования ошибок:
tour.on('error', function(error) {
fetch('/log-error', {
method: 'POST',
body: JSON.stringify({ message: error.message, stack: error.stack }),
headers: { 'Content-Type': 'application/json' }
});
});
Ошибки могут возникать и при переходе к следующему или предыдущему
шагу. Shepherd.js предоставляет хуки show,
hide и cancel, которые позволяют перехватывать
такие события:
tour.on('show', function(step) {
try {
const el = document.querySelector(step.options.attachTo.element);
if (!el) throw new Error(`Элемент "${step.options.attachTo.element}" отсутствует`);
} catch (error) {
console.warn(error.message);
displayErrorOverlay(error.message);
tour.cancel();
}
});
try/catch внутри событийного обработчика
обеспечивает безопасную проверку элементов.tour.cancel() корректно завершает тур при
критической ошибке.Можно объединить все элементы в универсальный обработчик ошибок:
function handleTourError(error, stepId) {
console.error(`Ошибка на шаге ${stepId}:`, error);
const overlay = document.createElement('div');
overlay.className = 'error-overlay';
overlay.textContent = error.message;
document.body.appendChild(overlay);
setTimeout(() => overlay.remove(), 5000);
}
tour.on('error', (error) => handleTourError(error, tour.getCurrentStep()?.id));
Эта методика обработки и отображения ошибок позволяет создать стабильный и предсказуемый пользовательский опыт при работе с интерактивными турами в Shepherd.js, минимизируя вероятность некорректного поведения и обеспечивая прозрачность возникающих проблем.