Библиотека Intro.js позволяет создавать интерактивные пошаговые туры по веб-приложению. Управление состоянием тура является ключевым аспектом, особенно при необходимости возобновления тура или проверки, завершён ли он пользователем.
Для начала, тур создаётся следующим образом:
const tour = introJs();
tour.setOptions({
steps: [
{ element: '#step1', intro: 'Это первый шаг' },
{ element: '#step2', intro: 'Это второй шаг' },
{ element: '#step3', intro: 'Это третий шаг' }
],
showStepNumbers: true,
exitOnOverlayClick: false
});
Здесь steps определяет последовательность элементов и
подсказок, которые будут показаны. Важно, что объект тура хранит
внутреннее состояние: текущий шаг, завершён ли тур и был ли он ранее
показан.
Метод currentStep() позволяет определить, на каком шаге
находится пользователь в данный момент:
const current = tour.currentStep();
console.log('Текущий шаг:', current);
0, что
соответствует первому шагу.Библиотека предоставляет флаг introJs()._completed для
внутреннего отслеживания состояния. Прямое использование не
рекомендуется, но его можно применять для отладки:
if (tour._completed) {
console.log('Тур уже завершён');
} else {
console.log('Тур ещё не завершён');
}
Более безопасный способ — хранить собственный флаг завершения с
использованием событий oncomplete и
onexit:
let tourCompleted = false;
tour.oncomplete(() => {
tourCompleted = true;
});
tour.onexit(() => {
tourCompleted = true;
});
После этого можно проверять состояние через переменную
tourCompleted.
Для длительного хранения состояния между сессиями используют локальное хранилище:
if (localStorage.getItem('introTourCompleted')) {
console.log('Тур уже был пройден ранее');
} else {
tour.start();
}
tour.oncomplete(() => {
localStorage.setItem('introTourCompleted', 'true');
});
tour.onexit(() => {
localStorage.setItem('introTourCompleted', 'true');
});
oncomplete, так и
onexit, чтобы фиксировать факт прекращения тура
пользователем досрочно.Если требуется продолжить тур с того шага, на котором пользователь
остановился, можно использовать метод goToStep(step):
const savedStep = parseInt(localStorage.getItem('introTourStep') || '0', 10);
tour.goToStep(savedStep).start();
tour.onchange((targetElement) => {
const stepIndex = tour.currentStep();
localStorage.setItem('introTourStep', stepIndex);
});
onchange срабатывает при переходе между шагами.Intro.js предоставляет несколько событий, которые помогают контролировать состояние тура:
Пример использования всех событий для полного контроля:
tour.onbeforechange((targetElement) => {
console.log('Перед изменением шага:', tour.currentStep());
});
tour.onchange((targetElement) => {
console.log('Сейчас на шаге:', tour.currentStep());
});
tour.oncomplete(() => {
console.log('Тур завершён');
});
tour.onexit(() => {
console.log('Тур досрочно завершён');
});
Помимо локального хранилища, удобно использовать объекты состояния в приложении:
const appState = {
tourCompleted: false,
currentTourStep: 0
};
tour.onchange(() => {
appState.currentTourStep = tour.currentStep();
});
tour.onexit(() => {
appState.tourCompleted = true;
});
Такой подход особенно полезен при SPA (Single Page Application), где управление состоянием тура может быть интегрировано с глобальным состоянием приложения (например, Redux или Vuex).
Если шаги тура привязаны к динамически создаваемым элементам, важно перед запуском проверять их наличие:
if (document.querySelector('#dynamicStep')) {
tour.start();
} else {
console.log('Элемент для шага не найден, тур не запускается');
}
Это предотвращает ошибки и некорректное отображение подсказок.
onchange и currentStep() для
точного отслеживания прогресса.localStorage или куки.completed) и текущего
шага (currentStep) для гибкого управления.Эти техники обеспечивают надёжный контроль состояния тура, позволяют возобновлять его с нужного шага и отслеживать завершение пользователем.