В PixiJS система событий наследует принципы DOM, но
адаптирована под графическую сцену. Каждый интерактивный объект
(DisplayObject) может получать события ввода, такие как
click, pointerdown, pointerup,
mousemove и другие. Основная особенность —
двухфазное распространение событий: capturing
(погружение) и bubbling (всплытие).
Фаза capturing происходит на пути от корня сцены к целевому объекту. Она позволяет родительским контейнерам перехватывать события до того, как они достигнут дочернего объекта.
on() можно указать параметр capture, хотя в
PixiJS это реализуется через interactiveChildren и порядок
добавления слушателей.const parent = new PIXI.Container();
const child = new PIXI.Sprite.from('image.png');
parent.addChild(child);
parent.interactive = true;
child.interactive = true;
parent.on('pointerdown', (event) => {
console.log('Capturing: родитель');
}, true); // третий параметр — capture
Здесь событие сначала будет обработано родителем при фазе погружения, а затем перейдёт к дочернему элементу.
Фаза bubbling срабатывает после того, как событие достигло целевого объекта. Оно распространяется снизу вверх, от целевого элемента к корню.
stopPropagation() останавливает дальнейшее распространение
события.child.on('pointerdown', (event) => {
console.log('Целевой объект');
event.stopPropagation(); // событие больше не всплывает
});
parent.on('pointerdown', (event) => {
console.log('Родитель всплытия');
});
Если stopPropagation() не вызывается, родитель также
обработает событие после дочернего объекта.
Для корректного распространения событий важно правильно настраивать иерархию объектов и их интерактивность:
interactive = true — объект реагирует на события.interactiveChildren = true — контейнер может передавать
события своим детям.Пример с контейнером и вложенными объектами:
const stage = new PIXI.Container();
const container = new PIXI.Container();
const sprite = new PIXI.Sprite.from('image.png');
container.addChild(sprite);
stage.addChild(container);
stage.interactive = true;
container.interactive = true;
sprite.interactive = true;
stage.on('pointerdown', () => console.log('stage'));
container.on('pointerdown', () => console.log('container'));
sprite.on('pointerdown', () => console.log('sprite'));
Нажатие на sprite приведёт к следующей
последовательности (без stopPropagation()):
Capturing: stage → container → sprite
Bubbling: sprite → container → stage
События в PixiJS передают объект event, содержащий
данные о взаимодействии:
event.data.global — координаты указателя относительно
сцены.event.data.getLocalPosition(target) — координаты
относительно конкретного объекта.event.stopPropagation() — остановка всплытия.event.currentTarget — объект, на котором вызвался
обработчик.event.target — изначальный объект, на котором произошло
событие.Это позволяет реализовывать точные взаимодействия с элементами сцены, фильтровать события по координатам и контролировать распространение.
interactiveChildren, чтобы события корректно
достигали всех объектов.Система capturing и bubbling в PixiJS обеспечивает мощный контроль над событиями в интерактивной сцене, позволяя реализовывать сложные взаимодействия, не перегружая код множеством отдельных слушателей. Контейнеры и спрайты могут как перехватывать события, так и реагировать на них на разных уровнях иерархии.