MCPcopy Index your code
hub / github.com/spritejs/spritejs / delegateEvents

Function delegateEvents

src/node/scene.js:63–168  ·  view source on GitHub ↗
(scene)

Source from the content-addressed store, hash-verified

61
62const touchEventCapturedTargets = {};
63function delegateEvents(scene) {
64 const events = ['mousedown', 'mouseup', 'mousemove', 'mousewheel', 'wheel',
65 'touchstart', 'touchend', 'touchmove', 'touchcancel',
66 'click', 'dblclick', 'longpress', 'tap', 'contextmenu'];
67
68 const container = scene.container;
69
70 container.addEventListener('mouseleave', (event) => {
71 const enteredTargets = scene[_enteredTargets];
72 if(enteredTargets.size) {
73 const leaveEvent = new Event('mouseleave');
74 leaveEvent.setOriginalEvent(event);
75 [...enteredTargets].forEach((target) => {
76 target.dispatchEvent(leaveEvent);
77 });
78 scene[_enteredTargets].clear();
79 }
80 }, {passive: true});
81
82 events.forEach((eventType) => {
83 container.addEventListener(eventType, (event) => {
84 const {left, top, displayRatio} = scene.options;
85 const layers = scene.orderedChildren;
86 const pointerEvents = createPointerEvents(event, {offsetLeft: left, offsetTop: top, displayRatio});
87 pointerEvents.forEach((evt) => {
88 // evt.scene = scene;
89 const id = evt.identifier;
90 if(evt.type === 'touchmove' || evt.type === 'touchend') {
91 const capturedTarget = touchEventCapturedTargets[id];
92 if(capturedTarget) capturedTarget.dispatchEvent(evt);
93 if(evt.type === 'touchend') delete touchEventCapturedTargets[id];
94 } else {
95 for(let i = layers.length - 1; i >= 0; i--) {
96 const layer = layers[i];
97 if(layer.options.handleEvent !== false) {
98 const ret = layer.dispatchPointerEvent(evt);
99 if(ret && evt.target !== layer) break;
100 else evt.cancelBubble = false; // prepare passing to next layer
101 }
102 }
103 if(evt.target === layers[0]) {
104 // trigger event on top layer
105 for(let i = layers.length - 1; i >= 0; i--) {
106 const layer = layers[i];
107 if(layer.options.handleEvent !== false) {
108 evt.target = layer;
109 break;
110 }
111 }
112 }
113 }
114 const target = evt.target;
115 if(evt.type === 'touchstart') {
116 touchEventCapturedTargets[id] = evt.target; // set captured event target
117 }
118 if(evt.type === 'mousemove') {
119 const enteredTargets = scene[_enteredTargets];
120 let enterSet;

Callers 1

constructorMethod · 0.70

Calls 8

setOriginalEventMethod · 0.95
clearMethod · 0.65
deleteMethod · 0.65
createPointerEventsFunction · 0.50
addEventListenerMethod · 0.45
dispatchEventMethod · 0.45
dispatchPointerEventMethod · 0.45
addMethod · 0.45

Tested by

no test coverage detected