Skip to content

Commit fe11a8e

Browse files
committed
pointerEvents: Add hold repeat events
interact(target) .pointerEvents({ holdRepeatInterval: 500, }) .on('hold', event => console.log(event.type, event.count)); Close #228
1 parent 572b001 commit fe11a8e

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ require('./legacyBrowsers');
55

66
// pointerEvents
77
require('./pointerEvents');
8+
require('./pointerEvents/holdRepeat');
89
require('./pointerEvents/interactableTargets');
910

1011
// inertia

src/pointerEvents/holdRepeat.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const pointerEvents = require('./index.js');
2+
const Interaction = require('../Interaction');
3+
4+
pointerEvents.signals.on('new', function ({ pointerEvent }) {
5+
pointerEvent.count = (pointerEvent.count || 0) + 1;
6+
});
7+
8+
pointerEvents.signals.on('fired', function ({ interaction, pointerEvent, eventTarget, targets }) {
9+
if (pointerEvent.type !== 'hold') { return; }
10+
11+
// get the repeat interval from the first eventable
12+
const interval = targets[0].eventable.options.holdRepeatInterval;
13+
14+
// don't repeat if the interval is 0 or less
15+
if (interval <= 0) { return; }
16+
17+
// set a timeout to fire the holdrepeat event
18+
interaction.holdIntervalHandle = setTimeout(function () {
19+
pointerEvents.collectEventTargets(interaction, pointerEvent, pointerEvent, eventTarget, 'hold');
20+
}, interval);
21+
});
22+
23+
function endHoldRepeat ({ interaction }) {
24+
// set the interaction's holdStopTime property
25+
// to stop further holdRepeat events
26+
if (interaction.holdIntervalHandle) {
27+
clearInterval(interaction.holdIntervalHandle);
28+
interaction.holdIntervalHandle = null;
29+
}
30+
}
31+
32+
for (const signal of ['move', 'up', 'cancel', 'endall']) {
33+
Interaction.signals.on(signal, endHoldRepeat);
34+
}
35+
36+
// don't repeat by default
37+
pointerEvents.defaults.holdRepeatInterval = 0;
38+
pointerEvents.types.push('holdrepeat');

src/pointerEvents/index.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,11 @@ function firePointers (interaction, pointer, event, eventTarget, targets, eventT
6969
}
7070

7171
const signalArg = {
72+
interaction,
7273
pointerEvent,
7374
pointer,
7475
event,
76+
eventTarget,
7577
targets,
7678
};
7779

@@ -93,6 +95,8 @@ function firePointers (interaction, pointer, event, eventTarget, targets, eventT
9395
pointerEvent.clientX -= originX;
9496
pointerEvent.clientY -= originY;
9597

98+
pointerEvent.eventable = target.eventable;
99+
96100
target.eventable.fire(pointerEvent);
97101

98102
pointerEvent.pageX += originX;
@@ -229,8 +233,7 @@ Interaction.signals.on('down', function ({ interaction, pointer, event, eventTar
229233
browser.isIE8? eventCopy : pointer,
230234
eventCopy,
231235
eventTarget,
232-
'hold',
233-
minDuration);
236+
'hold');
234237
}, minDuration);
235238
});
236239

0 commit comments

Comments
 (0)