При обновлении библиотеки Intro.js с версий 1.x или 2.x на более современные релизы (3.x и выше) важно учитывать изменения в API, структуре конфигурации и поведении методов. Несоблюдение этих изменений может привести к некорректной работе подсказок и неправильной инициализации шагов.
В старых версиях часто использовался прямой вызов
introJs().start();. В новых версиях рекомендуется создавать
отдельный экземпляр с последующей конфигурацией:
const intro = introJs();
intro.setOptions({
steps: [
{
element: '#step1',
intro: 'Это первый шаг'
},
{
element: '#step2',
intro: 'Это второй шаг'
}
],
showProgress: true
});
intro.start();
Ключевое отличие: теперь setOptions
принимает объект конфигурации, который может включать массив шагов,
глобальные настройки и параметры навигации.
tooltipPosition →
position Старый параметр
tooltipPosition заменён на position. Возможные
значения остались прежними: top, bottom,
left, right, auto.
hidePrev и hideNext
Для контроля видимости кнопок теперь используются методы экземпляра:
intro.setOption('showButtons', true); // Показывать все кнопки
intro.setOption('hidePrev', false); // Не скрывать кнопку "Назад"nextLabel и prevLabel
Настройка текста кнопок теперь через объект опций:
intro.setOptions({
nextLabel: 'Вперёд',
prevLabel: 'Назад',
skipLabel: 'Пропустить',
doneLabel: 'Готово'
});Ранее шаги определялись в виде простого массива объектов с полями
element и intro. В современных версиях
добавлены расширенные возможности:
position — явное указание позиции тултипа.tooltipClass — кастомизация класса для тултипа.highlightClass — класс для подсветки элемента.disableInteraction — блокировка взаимодействия с
элементом во время шага.Пример:
intro.setOptions({
steps: [
{
element: '#feature1',
intro: 'Описание функции 1',
position: 'right',
tooltipClass: 'custom-tooltip',
highlightClass: 'highlighted-element',
disableInteraction: true
},
{
element: '#feature2',
intro: 'Описание функции 2',
position: 'bottom'
}
]
});
В старых версиях активно использовались onbeforechange,
onchange, oncomplete, onexit. В
новых релизах синтаксис слегка изменился:
intro.onbeforechange(function(targetElement) {
console.log('Перед сменой шага:', targetElement);
});
intro.onchange(function(targetElement) {
console.log('Шаг изменён на элемент:', targetElement);
});
intro.oncomplete(function() {
console.log('Тур завершён');
});
intro.onexit(function() {
console.log('Тур прерван пользователем');
});
Особенности:
intro
.onchange(elem => console.log('Шаг:', elem))
.oncomplete(() => console.log('Готово'))
.start();
В старых версиях динамически добавленные DOM-элементы часто не
отображались корректно, так как шаги формировались при первом вызове
start(). В новых версиях для динамических шагов
рекомендуется использовать refresh() перед переходом на
шаг:
// Добавили новый элемент в DOM
document.body.insertAdjacentHTML('beforeend', '<div id="newStep">Новый шаг</div>');
intro.setOptions({
steps: [
{ element: '#existingStep', intro: 'Старый шаг' },
{ element: '#newStep', intro: 'Новый динамический шаг' }
]
});
intro.refresh(); // Обновление позиции и состояния шагов
intro.start();
Ранее текст кнопок локализовывался через глобальные свойства. Сейчас
рекомендуется задавать локализацию напрямую через
setOptions для конкретного экземпляра:
intro.setOptions({
nextLabel: 'Далее',
prevLabel: 'Назад',
skipLabel: 'Пропустить',
doneLabel: 'Завершить'
});
Дополнительно можно менять классы тултипов для кастомной стилизации текста:
intro.setOptions({
tooltipClass: 'my-tooltip-class'
});
С выходом версии 3.x произошли изменения в структуре CSS:
introjs-tooltip и
introjs-helperLayer сохраняются, но их внутренние элементы
(introjs-arrow, introjs-tooltiptext) могут
иметь другую вложенность.tooltipClass, highlightClass) теперь более
надёжна, чем прямое переопределение глобальных селекторов.Если в старой версии использовались кастомные функции навигации, например:
intro.onbeforechange(function(targetElement) {
if (targetElement.id === 'step2') {
intro.nextStep();
}
});
В новых версиях лучше использовать метод goToStep на
экземпляре:
intro.onbeforechange(function(targetElement) {
if (targetElement.id === 'step2') {
intro.goToStep(3); // Переход на конкретный шаг
}
});
Intro.js активно используется с React, Vue и Angular. В новых версиях рекомендуется:
componentDidMount в React, mounted в
Vue).refresh() при изменении DOM, особенно для
динамических компонентов.Если необходимо, могу подготовить подробную таблицу сравнения старых и новых опций Intro.js с конкретными примерами кода для каждой версии, чтобы процесс миграции был максимально наглядным.
Хотите, чтобы я её составил?