Intro.js — это библиотека для создания пошаговых интерактивных подсказок на веб-страницах. Одной из её мощных возможностей является внедрение интерактивных элементов внутрь подсказок, таких как кнопки, поля ввода, ссылки и другие элементы управления. Это позволяет не просто информировать пользователя, но и вовлекать его в процесс взаимодействия с интерфейсом.
Подсказки в Intro.js могут содержать произвольный HTML-контент. Для
этого используется опция intro при определении шага:
introJs().setOptions({
steps: [
{
element: '#step1',
intro: `
<h3>Введите ваше имя</h3>
<input type="text" id="username" placeholder="Имя">
<button id="submitBtn">Сохранить</button>
`
}
]
}).start();
Ключевые моменты:
intro.После того как подсказка отрендерена, элементы внутри неё становятся
доступными для привязки событий. Intro.js предоставляет событие
onafterchange, которое срабатывает после отображения
текущего шага:
introJs().onafterchange(function(targetElement) {
const submitBtn = document.getElementById('submitBtn');
if(submitBtn) {
submitBtn.addEventListener('click', () => {
const username = document.getElementById('username').value;
console.log('Имя пользователя:', username);
this.nextStep(); // переход к следующему шагу
});
}
}).start();
Особенности:
onafterchange вызывается при каждом шаге, что позволяет
динамически добавлять обработчики.nextStep() и previousStep()
позволяют программно управлять навигацией между шагами.Intro.js не ограничивает типы HTML-элементов внутри подсказки. Можно использовать:
intro: `
<form id="signupForm">
<input type="text" placeholder="Имя">
<input type="email" placeholder="Email">
<button type="submit">Регистрация</button>
</form>
`
intro: `
<label>Выберите цвет:</label>
<select id="colorSelect">
<option value="red">Красный</option>
<option value="green">Зелёный</option>
</select>
`
intro: `
<button id="openModal">Открыть модальное окно</button>
`
Для корректной работы с такими компонентами следует использовать
привязку событий через onafterchange и управлять логикой
внутри колбэков.
Для улучшения UX интерактивных элементов важно управлять фокусом и обработкой клавиш. Intro.js автоматически блокирует взаимодействие с остальным интерфейсом, но элементы внутри подсказки остаются доступными:
introJs().onafterchange(function(targetElement) {
const input = document.getElementById('username');
if(input) {
input.focus();
input.addEventListener('keydown', function(e) {
if(e.key === 'Enter') {
document.getElementById('submitBtn').click();
}
});
}
}).start();
Рекомендации:
Контент подсказки можно менять на лету, например, в зависимости от ввода пользователя:
introJs().onafterchange(function(targetElement) {
const input = document.getElementById('username');
const message = document.getElementById('greeting');
if(input && message) {
input.addEventListener('input', () => {
message.textContent = `Привет, ${input.value}`;
});
}
}).start();
Особенности динамического контента:
Подсказки Intro.js могут включать компоненты сторонних библиотек
(например, Select2, Datepicker или графические
виджеты). Для этого необходимо:
onafterchange:introJs().onafterchange(function() {
$('#datepicker').datepicker(); // инициализация jQuery UI Datepicker
}).start();
Примечания:
Иногда требуется, чтобы шаг считался завершённым только после выполнения действия пользователя. Для этого используют комбинацию событий и методов навигации:
introJs().onafterchange(function() {
const submitBtn = document.getElementById('submitBtn');
submitBtn.disabled = true;
const input = document.getElementById('username');
input.addEventListener('input', () => {
submitBtn.disabled = input.value.trim() === '';
});
submitBtn.addEventListener('click', () => {
this.nextStep();
});
}).start();
Ключевые аспекты:
Такой подход позволяет создавать полноценные интерактивные руководства с формами, кнопками, динамическими подсказками и любыми элементами управления прямо внутри шагов Intro.js, повышая вовлеченность пользователя и делая интерфейс более понятным.