Порядок выполнения событий

Shepherd.js предоставляет гибкий API для создания интерактивных пользовательских гидов, где каждая подсказка (tour step) может сопровождаться собственными событиями. Управление порядком выполнения этих событий является ключевым аспектом для построения логичных и плавных сценариев взаимодействия.

События тура и их назначение

Каждый шаг тура в Shepherd.js может генерировать набор событий. Основные из них:

  • show — вызывается при отображении шага.
  • hide — срабатывает при скрытии шага.
  • complete — возникает при завершении шага или всего тура.
  • cancel — вызывается, если тур был прерван.

События позволяют добавлять кастомную логику, например, запуск анимации, изменение состояния приложения или динамическое изменение следующего шага.

Порядок вызова событий

Понимание последовательности срабатывания событий критично для корректного построения гида:

  1. Инициализация тура — при вызове tour.start() происходят подготовительные процессы и события для первого шага.
  2. Отображение шага — срабатывает show. Любые действия внутри этого обработчика выполняются до того, как пользователь увидит подсказку.
  3. Взаимодействие с пользователем — кнопки Next, Back и кастомные действия могут вызвать переход к следующему шагу.
  4. Скрытие шага — событие hide выполняется после того, как текущий шаг будет скрыт из DOM.
  5. Завершение тура — после последнего шага вызывается complete. При досрочном завершении срабатывает cancel.

Асинхронные действия и порядок выполнения

Shepherd.js поддерживает асинхронные функции в обработчиках событий. Это позволяет корректно управлять действиями, которые требуют ожидания:

tour.addStep({
  id: 'async-step',
  text: 'Подождите перед продолжением...',
  buttons: [
    {
      text: 'Далее',
      action: async () => {
        await fetchData();
        tour.next();
      }
    }
  ]
});

В этом примере tour.next() будет вызван только после завершения асинхронной операции fetchData(), обеспечивая правильный порядок действий.

Связывание событий между шагами

Для создания сложных сценариев часто требуется, чтобы события одного шага влияли на последующие шаги:

  • Передача данных через объект tour или глобальный контекст:

    tour.on('show', (event) => {
      tour.userData = { stepShown: event.step.id };
    });
    
    tour.addStep({
      id: 'next-step',
      text: () => `Предыдущий шаг: ${tour.userData.stepShown}`
    });
  • Условная логика перехода: можно пропускать или изменять шаги в зависимости от состояния приложения.

Важность правильной синхронизации

Нарушение порядка событий может привести к некорректной работе интерфейса: всплывающие подсказки будут отображаться в неправильном порядке, данные могут не успевать обновляться. Для обеспечения синхронизации:

  • Использовать async/await в обработчиках действий и событий.
  • Проверять готовность элементов DOM перед вызовом tour.show().
  • Разделять логику визуальных эффектов и бизнес-логику, чтобы события не блокировали друг друга.

Методы для контроля последовательности

Shepherd.js предоставляет встроенные методы для управления шагами:

  • tour.next() — переход к следующему шагу.
  • tour.back() — возврат к предыдущему шагу.
  • tour.cancel() — завершение тура досрочно.
  • tour.show(id) — отображение конкретного шага по идентификатору.

Использование этих методов совместно с событиями show и hide позволяет создавать полностью детерминированные последовательности действий.

Практические рекомендации

  1. Явно задавать порядок шагов через массив steps при инициализации тура.
  2. Минимизировать побочные эффекты внутри обработчиков событий.
  3. Использовать события для логирования и аналитики, не вмешиваясь в основной поток навигации.
  4. Тестировать каждый сценарий с разными последовательностями действий пользователя, чтобы убедиться в стабильности порядка событий.

Корректное управление порядком выполнения событий в Shepherd.js обеспечивает плавность пользовательских гидов и предотвращает неожиданные баги при динамическом взаимодействии с интерфейсом.