Код, который вы опубликовали, имеет одну большую проблему: он использует глобальные переменные для хранения состояния объекта ImageTrail. Это довольно плохая практика программирования, поскольку она приводит к неожиданному поведению и в первую очередь лишает цели иметь класс.
Причина, по которой отображается только первый набор изображений, заключается в том, что оба экземпляра регистра ImageTrail обратный вызов для следующего кадра анимации с requestAnimationFrame
. Обратный вызов (render
) первого экземпляра всегда вызывается первым, потому что он первым зарегистрировал слушателя. Эта первая функция рендеринга обновляет глобальные переменные mousePos
. Вторая функция рендеринга думает, что мышь не двигалась, потому что lastMousePos
и mousePos
одинаковы.
Теперь, чтобы решить вашу проблему: сначала вы должны переместить все состояние, которое используется ImageTrail, в класс itsef. Это включает mousePos
, cacheMousePos
и lastMousePos
. Если вы сделали это успешно, вы должны получить оба набора изображений одновременно, если у вас есть два экземпляра. Чтобы активировать / деактивировать рендеринг ImageTrails, вы можете добавить активный атрибут, который проверяется при каждом вызове рендеринга, или вы можете реализовать методы, которые отменяют / настраивают фрейм анимации для указанного c экземпляра. (Подробнее о том, как использовать cancelAnimationFrame
, вы можете посмотреть в ответе rahul или в MDN )