Shepherd.js предоставляет механизм управления пользовательским взаимодействием с шагами руководства (tour), включая возможность блокировки навигации. Это необходимо в случаях, когда переход к следующему шагу должен происходить только после выполнения определённого условия, например, заполнения формы, нажатия кнопки или завершения анимации.
canClickTargetКлючевой инструмент для контроля навигации — свойство
canClickTarget. Оно задаётся на уровне шага и определяет,
может ли пользователь перейти к следующему шагу, кликая на элемент на
странице. Тип значения — булевый (true/false)
или функция, возвращающая булево значение.
Пример использования:
const tour = new Shepherd.Tour({
defaultStepOptions: {
scrollTo: true
}
});
tour.addStep({
id: 'step1',
text: 'Нажмите кнопку для продолжения',
attachTo: {
element: '#myButton',
on: 'bottom'
},
canClickTarget: false, // блокируем переход по клику на элемент
buttons: [
{
text: 'Продолжить',
action: tour.next
}
]
});
tour.start();
В данном примере пользователь не сможет перейти к следующему шагу,
кликая по кнопке, пока не нажмёт кнопку Продолжить.
Свойство canClickTarget может быть функцией, что
позволяет динамически контролировать доступность шага:
tour.addStep({
id: 'step2',
text: 'Введите текст в поле',
attachTo: {
element: '#inputField',
on: 'top'
},
canClickTarget: () => {
const input = document.querySelector('#inputField');
return input.value.trim() !== ''; // блокируем, пока поле пустое
},
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
В этом случае блокировка автоматически снимается, когда пользователь вводит данные в поле. Это делает интерфейс интерактивным и предотвращает преждевременный переход.
Кроме клика по элементу, навигацию можно ограничивать через кастомные
кнопки с помощью функции enabled или программной
проверки:
tour.addStep({
id: 'step3',
text: 'Согласитесь с условиями',
attachTo: {
element: '#termsCheckbox',
on: 'right'
},
buttons: [
{
text: 'Далее',
action: tour.next,
enabled: false
}
]
});
const checkbox = document.querySelector('#termsCheckbox');
checkbox.addEventListener('change', () => {
const button = document.querySelector('.shepherd-button');
button.disabled = !checkbox.checked; // динамически включаем кнопку
});
Таким образом, пользователь не сможет нажать кнопку
Далее, пока не выполнит условие.
Shepherd.js позволяет подписываться на события шага, что позволяет блокировать навигацию программно:
tour.on('before-show', (event) => {
const step = event.step;
if (step.id === 'step4') {
const conditionMet = checkSomeCondition();
if (!conditionMet) {
event.preventDefault(); // предотвращает показ шага
}
}
});
Метод event.preventDefault() полностью останавливает
переход к шагу, пока условие не будет выполнено.
advanceOnИногда блокировка должна зависеть не только от клика или кнопки, а от
определённого события DOM. В этом случае используется параметр
advanceOn:
tour.addStep({
id: 'step5',
text: 'Нажмите любую кнопку для продолжения',
attachTo: {
element: '#actionButton',
on: 'bottom'
},
advanceOn: {
selector: '#actionButton',
event: 'click'
}
});
Здесь шаг автоматически продвигается только при срабатывании события
click на элементе #actionButton, исключая
любую другую навигацию.
before-show и
before-hide. Это позволяет гибко управлять шагами
и предотвращать ошибки при сложных взаимодействиях.Блокировка навигации в Shepherd.js обеспечивает строгий контроль над
последовательностью шагов руководства. Она реализуется через
canClickTarget, динамические проверки, кастомные кнопки и
события. Корректное использование этих инструментов делает туры
интерактивными, безопасными и удобными для сложных пользовательских
интерфейсов.