Библиотека Intro.js предназначена для создания пошаговых интерактивных руководств по интерфейсу. Одним из ключевых аспектов её применения является возможность передачи данных в обработчики событий, что позволяет динамически изменять поведение шагов и адаптировать интерфейс под действия пользователя.
Intro.js предоставляет набор встроенных событий, к которым можно привязывать пользовательские функции:
onbeforechange — вызывается перед сменой текущего шага.
Позволяет подготовить интерфейс, изменить состояние элементов.onafterchange — срабатывает сразу после перехода на
шаг, подходит для анимации элементов или обновления контента.oncomplete — вызывается при завершении всех шагов.onexit — срабатывает при досрочном выходе из
руководства.onchange — вызывается при любом изменении шага.Каждое из этих событий может принимать функцию-обработчик, в которую можно передавать как стандартные параметры Intro.js, так и дополнительные данные через контекст.
Каждый шаг в Intro.js описывается объектом с ключевыми свойствами:
intro.setOptions({
steps: [
{
element: '#step1',
intro: 'Это первый шаг',
data: { userId: 123, role: 'admin' }
},
{
element: '#step2',
intro: 'Второй шаг',
data: { userId: 456, role: 'guest' }
}
]
});
Ключевой момент: свойство data не
является встроенным, но может использоваться для передачи произвольной
информации в обработчики событий. Функция-обработчик может извлечь этот
объект из текущего шага через метод intro._currentStep или
intro._introItems[intro._currentStep].data.
onafterchangeintro.onafterchange(function(targetElement) {
const currentStepData = intro._introItems[intro._currentStep].data;
if (currentStepData.role === 'admin') {
targetElement.style.border = '2px solid red';
} else {
targetElement.style.border = '2px solid blue';
}
console.log('Текущий пользователь:', currentStepData.userId);
});
В этом примере каждый шаг содержит объект data, который
позволяет настроить визуальное оформление и логику в зависимости от роли
пользователя.
Если требуется передать данные, которые не хранятся в шаге, можно использовать замыкания:
function createHandler(customValue) {
return function(targetElement) {
console.log('Используемое значение:', customValue);
targetElement.style.backgroundColor = customValue.color;
};
}
intro.onafterchange(createHandler({ color: 'yellow', flag: true }));
Такой подход позволяет динамически конфигурировать обработчики без изменения глобального состояния.
thisВнутри обработчиков событий можно использовать объект
this, который ссылается на текущий экземпляр Intro.js. Это
открывает доступ ко всем методам и свойствам:
intro.onbeforechange(function() {
const stepIndex = this._currentStep;
const stepData = this._introItems[stepIndex].data;
console.log('Подготавливаем шаг:', stepIndex, stepData);
});
Использование this гарантирует корректное извлечение
данных даже при изменении порядка шагов или добавлении новых шагов в
реальном времени.
Передача данных становится особенно мощной при комбинировании
нескольких событий. Например, можно задать динамическое поведение на
onbeforechange и использовать результат для настройки
onafterchange:
intro.onbeforechange(function(targetElement) {
const stepData = this._introItems[this._currentStep].data;
stepData.modifiedMessage = 'Привет, ' + stepData.role;
});
intro.onafterchange(function(targetElement) {
const stepData = this._introItems[this._currentStep].data;
targetElement.innerText += ' (' + stepData.modifiedMessage + ')';
});
data шага, чтобы
избежать конфликтов с внутренними свойствами Intro.js.this: всегда проверять, что
используется корректный объект Intro.js, особенно при асинхронных
вызовах.textContent вместо
innerHTML).Передача данных в обработчики событий Intro.js позволяет сделать пошаговое руководство интерактивным, адаптивным и контекстно зависимым, что значительно повышает качество пользовательского опыта.