Конфликты с другими библиотеками

При использовании Driver.js в сложных проектах часто возникают ситуации, когда библиотека вступает в конфликт с другими скриптами или фреймворками. Основные причины таких конфликтов связаны с глобальными пространствами имён, перезаписью событий и конфликтами CSS.


Глобальные переменные и namespace

Driver.js создаёт объект Driver в глобальном пространстве. Если другая библиотека использует такое же имя или существует локальный конфликт с переменными window.Driver, возможны ошибки типа:

Uncaught TypeError: Driver is not a constructor

Решения:

  • Использовать модульную систему ES6 import или require:
import Driver from 'driver.js';
const driver = new Driver();
  • Избегать подключения Driver.js через <script> в глобальном пространстве при наличии других библиотек, использующих одинаковые имена.

Конфликты событий

Driver.js активно использует обработчики событий, в частности click, mouseover, keydown. Если на том же элементе уже висит обработчик от другой библиотеки, возможны:

  • Перехват события Driver.js другим скриптом
  • Некорректное срабатывание шагов обучения

Рекомендации по предотвращению:

  • Добавлять шаги Driver.js только после инициализации всех других обработчиков.
  • Использовать метод stopPropagation с осторожностью.
  • Для критических элементов использовать уникальные идентификаторы, чтобы исключить пересечение с селекторами других библиотек.

Конфликты CSS

Driver.js применяет к элементам обводку (outline) и затемнение фона (overlay) через собственные классы:

.driver-highlighted-element { z-index: 9999; }
.driver-overlay { background-color: rgba(0,0,0,0.7); }

Если проект использует CSS-фреймворки типа Bootstrap, Material UI или Tailwind, возможны следующие проблемы:

  • z-index перекрывается стилями других модулей.
  • Анимации и переходы не работают из-за глобальных transition или overflow.
  • Наложение стилей перекрывает кнопку закрытия или стрелки навигации Driver.js.

Методы решения:

  • Переопределять CSS через селекторы с высокой специфичностью:
.driver-overlay {
    z-index: 20000 !important;
    background-color: rgba(0,0,0,0.8) !important;
}
  • Проверять position родительских элементов (relative, absolute) для корректного наложения подсветки.
  • Использовать отдельный контейнер для Driver.js (appendTo), чтобы избежать вмешательства в общий DOM.

Совместимость с SPA (React, Vue, Angular)

В одностраничных приложениях Driver.js может конфликтовать с виртуальным DOM:

  • Элементы, которые подсвечиваются, могут ещё не быть отрендерены.
  • При навигации по маршрутам DOM обновляется, и ссылки на элементы становятся невалидными.

Практические подходы:

  • Инициализировать Driver.js после полной отрисовки компонента (componentDidMount, onMounted).
  • Использовать observe или динамически пересоздавать шаги при изменении DOM.
  • Удалять Driver.js при размонтировании компонента, чтобы предотвратить накопление слушателей событий.

Конфликты с другими библиотеками подсветки и тултипов

Если на странице одновременно работают tippy.js, intro.js или кастомные подсказки, возможны:

  • Перекрытие подсветки элементов
  • Неправильное вычисление позиции тултипов
  • Ошибки при обработке нажатия клавиш (ESC, Enter)

Решения:

  • Задерживать инициализацию Driver.js до окончания анимации других тултипов.
  • Использовать уникальные CSS-классы для Driver.js и отключать глобальные анимации для подсветки.
  • При необходимости отключать другие библиотеки на время работы обучения, затем восстанавливать их.

Программные обходные пути конфликтов

  1. Проверка существования Driver перед созданием экземпляра:
if (typeof Driver !== 'undefined') {
    const driver = new Driver();
}
  1. Использование setTimeout для гарантии рендеринга элементов:
setTimeout(() => {
    driver.start();
}, 500);
  1. Удаление всех слушателей при завершении обучения:
driver.reset(true); // сбрасывает все обработчики событий
  1. Изоляция через iframe или shadow DOM для сложных модулей, чтобы Driver.js не пересекался с глобальными стилями и скриптами.

Рекомендации по отладке

  • Использовать DevTools для проверки, какие обработчики событий назначены элементам (getEventListeners).
  • Проверять наличие конфликтующих CSS-классов через инспектор.
  • Логировать ошибки через driver.on('next', callback) и driver.on('error', callback).

Такая структура предотвращает большинство конфликтов и позволяет безопасно интегрировать Driver.js в проекты с несколькими библиотеками и сложным DOM.