Кнопки — ключевой элемент управления шагами в библиотеке Shepherd.js. Они определяют навигацию между шагами, позволяют завершать тур, выполнять произвольные действия и интегрировать пользовательскую логику. Гибкая система конфигурации кнопок позволяет полностью контролировать поведение интерфейса.
Кнопки задаются в массиве buttons внутри конфигурации
шага:
tour.addStep({
id: 'step-1',
text: 'Описание шага',
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
Каждая кнопка представляет собой объект со следующими основными свойствами:
Shepherd предоставляет встроенные методы управления туром:
buttons: [
{
text: 'Назад',
action: tour.back
},
{
text: 'Далее',
action: tour.next
},
{
text: 'Завершить',
action: tour.complete
}
]
Ключевые методы:
tour.next() — переход к следующему шагуtour.back() — возврат к предыдущемуtour.cancel() — отмена тураtour.complete() — завершениеКнопка может выполнять произвольный код:
buttons: [
{
text: 'Проверить',
action: function() {
console.log('Проверка выполнена');
tour.next();
}
}
]
Контекст this внутри функции ссылается на текущий
шаг:
action: function() {
console.log(this.id);
}
buttons: [
{
text: 'Далее',
action: tour.next,
disabled: true
}
]
Динамическое изменение:
const step = tour.getById('step-1');
step.updateStepOptions({
buttons: [
{
text: 'Далее',
action: tour.next,
disabled: false
}
]
});
buttons: [
{
text: 'Продолжить',
action: function() {
if (document.querySelector('#agree').checked) {
tour.next();
} else {
alert('Необходимо согласие');
}
}
}
]
buttons: [
{
text: 'Далее',
action: tour.next,
classes: 'btn btn-primary'
},
{
text: 'Отмена',
action: tour.cancel,
classes: 'btn btn-secondary',
secondary: true
}
]
Свойство secondary добавляет встроенный стиль Shepherd
для вторичных кнопок.
.shepherd-button.custom-next {
background-color: #4CAF50;
color: white;
border-radius: 6px;
}
.shepherd-button.custom-cancel {
background-color: transparent;
color: #999;
}
buttons: [
{
text: 'Далее',
action: tour.next,
classes: 'custom-next'
},
{
text: 'Пропустить',
action: tour.cancel,
classes: 'custom-cancel'
}
]
Кнопки могут выполнять асинхронные операции:
buttons: [
{
text: 'Загрузить',
action: async function() {
const data = await fetch('/api/data');
const result = await data.json();
console.log(result);
tour.next();
}
}
]
buttons: [
{
text: 'Отправить',
action: async function() {
const button = this.el.querySelector('.shepherd-button');
button.disabled = true;
button.innerText = 'Загрузка...';
await new Promise(resolve => setTimeout(resolve, 2000));
tour.next();
}
}
]
Частый сценарий — комбинирование кнопок:
buttons: [
{
text: 'Назад',
action: tour.back,
secondary: true
},
{
text: 'Пропустить',
action: tour.cancel,
secondary: true
},
{
text: 'Далее',
action: tour.next
}
]
Порядок в массиве определяет порядок отображения.
tour.addStep({
id: 'step-final',
text: 'Финальный шаг',
buttons: [
{
text: 'Готово',
action: function() {
console.log('Тур завершён');
tour.complete();
}
}
]
});
let isValid = false;
buttons: [
{
text: 'Продолжить',
action: function() {
if (!isValid) {
alert('Ошибка');
return;
}
tour.next();
}
}
]
Важно учитывать различие контекста:
{
text: 'Далее',
action: () => {
tour.next();
}
}
Стрелочные функции не имеют собственного this, поэтому
доступ к шагу через this невозможен. Для доступа к текущему
шагу используется обычная функция:
action: function() {
console.log(this);
}
const step = tour.getById('step-1');
step.updateStepOptions({
buttons: [
{
text: 'Новое действие',
action: tour.next
}
]
});
step.updateStepOptions({
buttons: []
});
Кнопка может взаимодействовать с DOM:
buttons: [
{
text: 'Открыть меню',
action: function() {
document.querySelector('#menu').classList.add('open');
tour.next();
}
}
]
buttons: [
{
text: 'Продолжить',
action: function() {
const input = document.querySelector('#email');
if (!input.value.includes('@')) {
input.classList.add('error');
return;
}
tour.next();
}
}
]
buttons: [
{
text: 'Удалить',
action: function() {
if (confirm('Вы уверены?')) {
console.log('Удалено');
tour.next();
}
}
}
]
Минимизация количества кнопок Избыточное количество элементов снижает понятность интерфейса.
Явные действия Названия кнопок должны отражать результат: «Сохранить», «Пропустить», «Завершить».
Разделение первичных и вторичных действий
Использование secondary помогает визуально выделить
основной путь.
Обработка ошибок Любое пользовательское действие должно предусматривать возможные ошибки.
Асинхронная безопасность При работе с API необходимо блокировать повторные нажатия.
Использование стрелочных функций с
this
action: () => {
console.log(this); // undefined или глобальный объект
}
Отсутствие перехода между шагами
action: function() {
console.log('Нажато'); // нет tour.next()
}
Жёсткая привязка к DOM
document.querySelector('#nonexistent')
Система кнопок в Shepherd позволяет:
Кнопки перестают быть просто элементом навигации и становятся полноценным инструментом управления пользовательским сценарием.