forked from kurtextrem/Twitch5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pointerevent.js
122 lines (121 loc) · 6.35 KB
/
pointerevent.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
'use strict';
(() => {
const _оСвойства = {
pointerId: 0,
width: 1,
height: 1,
pressure: 0,
tangentialPressure: 0,
tiltX: 0,
tiltY: 0,
twist: 0,
pointerType: '',
isPrimary: false
};
class PointerEvent extends MouseEvent {
constructor(сТипСобытия, оПараметры = {}) {
super(сТипСобытия, оПараметры);
const оОпределениеСвойства = {
enumerable: true,
configurable: true
};
for (let сИмя of Object.keys(_оСвойства)) {
if (сИмя in оПараметры) {
if (typeof оПараметры[сИмя] != typeof _оСвойства[сИмя] || Number.isNaN(оПараметры[сИмя])) {
throw new TypeError(`В конструктор PointerEvent передан параметр ${сИмя} недопустимого типа`);
}
оОпределениеСвойства.value = оПараметры[сИмя];
} else {
оОпределениеСвойства.value = _оСвойства[сИмя];
}
Object.defineProperty(this, сИмя, оОпределениеСвойства);
}
}
}
let _лЗадерживатьСообщенияМыши = false;
function СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, сТипСобытия, button) {
const оПараметры = {};
оПараметры.bubbles = оСобытиеМыши.bubbles;
оПараметры.cancelable = оСобытиеМыши.cancelable;
оПараметры.composed = true;
оПараметры.view = оСобытиеМыши.view;
оПараметры.ctrlKey = оСобытиеМыши.ctrlKey;
оПараметры.shiftKey = оСобытиеМыши.shiftKey;
оПараметры.altKey = оСобытиеМыши.altKey;
оПараметры.metaKey = оСобытиеМыши.metaKey;
оПараметры.modifierAltGraph = оСобытиеМыши.getModifierState('AltGraph');
оПараметры.modifierCapsLock = оСобытиеМыши.getModifierState('CapsLock');
оПараметры.modifierNumLock = оСобытиеМыши.getModifierState('NumLock');
оПараметры.modifierScrollLock = оСобытиеМыши.getModifierState('ScrollLock');
оПараметры.screenX = оСобытиеМыши.screenX;
оПараметры.screenY = оСобытиеМыши.screenY;
оПараметры.clientX = оСобытиеМыши.clientX;
оПараметры.clientY = оСобытиеМыши.clientY;
оПараметры.button = button;
оПараметры.buttons = оСобытиеМыши.buttons;
оПараметры.relatedTarget = оСобытиеМыши.relatedTarget;
оПараметры.pressure = оПараметры.buttons === 0 ? 0 : .5;
оПараметры.pointerType = 'mouse';
оПараметры.isPrimary = true;
const оСобытиеУказателя = new PointerEvent(сТипСобытия, оПараметры);
Object.defineProperty(оСобытиеУказателя, 'timeStamp', {
enumerable: true,
configurable: true,
value: оСобытиеМыши.timeStamp
});
const лОтменено = !оСобытиеМыши.target.dispatchEvent(оСобытиеУказателя);
if (лОтменено) {
оСобытиеМыши.preventDefault();
}
return лОтменено;
}
const ОбработатьMouseDown = ДобавитьОбработчикИсключений(оСобытиеМыши => {
if ((оСобытиеМыши.buttons & оСобытиеМыши.buttons - 1) == 0) {
_лЗадерживатьСообщенияМыши = СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointerdown', оСобытиеМыши.button);
} else {
СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointermove', оСобытиеМыши.button);
}
if (_лЗадерживатьСообщенияМыши) {
оСобытиеМыши.stopImmediatePropagation();
оСобытиеМыши.stopPropagation();
}
});
const ОбработатьMouseMove = ДобавитьОбработчикИсключений(оСобытиеМыши => {
СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointermove', -1);
if (_лЗадерживатьСообщенияМыши) {
оСобытиеМыши.stopImmediatePropagation();
оСобытиеМыши.stopPropagation();
}
});
const ОбработатьMouseUp = ДобавитьОбработчикИсключений(оСобытиеМыши => {
if (оСобытиеМыши.buttons === 0) {
СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointerup', оСобытиеМыши.button);
} else {
СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointermove', оСобытиеМыши.button);
}
if (_лЗадерживатьСообщенияМыши) {
оСобытиеМыши.stopImmediatePropagation();
оСобытиеМыши.stopPropagation();
}
if (оСобытиеМыши.buttons === 0) {
_лЗадерживатьСообщенияМыши = false;
}
});
const ОбработатьMouseOver = ДобавитьОбработчикИсключений(оСобытиеМыши => {
СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointerover', -1);
});
const ОбработатьMouseOut = ДобавитьОбработчикИсключений(оСобытиеМыши => {
СоздатьИПослатьСобытиеУказателяДляМыши(оСобытиеМыши, 'pointerout', -1);
});
Object.defineProperty(window, PointerEvent, {
writable: true,
configurable: true,
value: PointerEvent
});
м_Журнал.Ой('[PointerEvent] Использую события мыши');
window.addEventListener('mousedown', ОбработатьMouseDown, true);
window.addEventListener('mousemove', ОбработатьMouseMove, true);
window.addEventListener('mouseup', ОбработатьMouseUp, true);
window.addEventListener('mouseover', ОбработатьMouseOver, true);
window.addEventListener('mouseout', ОбработатьMouseOut, true);
})();