В библиотеке Shepherd.js объект button используется для
описания кнопок, отображаемых внутри шага (step) тура. Эти
кнопки управляют навигацией, взаимодействием пользователя и поведением
тура в целом. Каждый шаг может содержать массив кнопок, каждая из
которых задаётся как отдельный объект с набором свойств.
Минимальный пример:
buttons: [
{
text: 'Далее',
action: tour.next
}
]
Каждый объект внутри массива buttons представляет одну
кнопку и может включать несколько параметров, влияющих на внешний вид и
поведение.
textОпределяет текст, отображаемый на кнопке.
{
text: 'Назад'
}
<strong>,
<span>)Пример с HTML:
{
text: '<strong>Далее</strong>'
}
actionОпределяет функцию, которая будет вызвана при нажатии на кнопку.
{
text: 'Далее',
action: tour.next
}
Возможные варианты:
Встроенные методы тура:
tour.next — переход к следующему шагуtour.back — возврат к предыдущему шагуtour.cancel — завершение тураtour.complete — завершение с отметкой об успехеПользовательская функция:
{
text: 'Проверить',
action: () => {
console.log('Кнопка нажата');
}
}
Контекст выполнения:
this ссылается на текущий шаг
(step)this.tourПример:
{
text: 'Следующий',
action() {
console.log(this); // текущий шаг
this.tour.next();
}
}
classesПозволяет добавить CSS-классы к кнопке.
{
text: 'Удалить',
classes: 'btn btn-danger'
}
Особенности:
secondaryОпределяет, является ли кнопка вторичной (менее акцентированной).
{
text: 'Отмена',
action: tour.cancel,
secondary: true
}
Поведение:
disabledОтключает кнопку, делая её неактивной.
{
text: 'Далее',
action: tour.next,
disabled: true
}
Особенности:
true или falselabelОпределяет текст для атрибута aria-label, используемого
для доступности.
{
text: '→',
label: 'Следующий шаг',
action: tour.next
}
Назначение:
Объект кнопки может включать сразу несколько параметров:
{
text: 'Продолжить',
action: tour.next,
classes: 'btn-primary',
secondary: false,
disabled: false,
label: 'Перейти к следующему шагу'
}
Массив buttons позволяет задавать несколько кнопок:
buttons: [
{
text: 'Назад',
action: tour.back,
secondary: true
},
{
text: 'Далее',
action: tour.next
}
]
Порядок в массиве определяет порядок отображения кнопок.
Кнопки могут изменять поведение в зависимости от состояния приложения:
{
text: 'Проверить',
action() {
const isValid = validateForm();
if (isValid) {
this.tour.next();
} else {
alert('Ошибка');
}
}
}
Возможности:
Поддерживается работа с async/await:
{
text: 'Загрузить',
action: async function () {
await fetchData();
this.tour.next();
}
}
Важно учитывать:
disabled)Кнопки могут взаимодействовать с DOM и внешними состояниями:
{
text: 'Открыть меню',
action() {
document.querySelector('#menu').classList.add('open');
this.tour.next();
}
}
Навигационные кнопки:
[
{ text: 'Назад', action: tour.back, secondary: true },
{ text: 'Далее', action: tour.next }
]
Завершение тура:
{
text: 'Завершить',
action: tour.complete
}
Отмена:
{
text: 'Пропустить',
action: tour.cancel,
secondary: true
}
1. Потеря контекста this:
action: function() {
this.tour.next(); // корректно
}
action: () => {
this.tour.next(); // ошибка — стрелочная функция не имеет собственного this
}
2. Отсутствие action:
Кнопка без обработчика не выполняет никаких действий:
{
text: 'Ничего не делает'
}
3. Неправильное использование
disabled:
disabled: 'true' // ошибка — должно быть boolean
Условное отображение кнопок:
Хотя Shepherd напрямую не поддерживает скрытие кнопок, можно динамически формировать массив:
const buttons = [];
if (userIsAdmin) {
buttons.push({
text: 'Удалить',
action: deleteItem
});
}
buttons.push({
text: 'Далее',
action: tour.next
});
Каждая кнопка связана с текущим шагом и может:
Контекст шага (this) позволяет обращаться к:
this.tourthis.optionsРекомендуемая структура:
secondarysecondary: trueПример:
[
{
text: 'Отмена',
action: tour.cancel,
secondary: true
},
{
text: 'Продолжить',
action: tour.next
}
]
Такой подход улучшает UX и делает интерфейс предсказуемым.
{
text: String,
action: Function,
classes: String,
secondary: Boolean,
disabled: Boolean,
label: String
}
Каждое свойство является опциональным, за исключением
text и action, которые практически всегда
используются вместе для полноценной кнопки управления.