forked from bumbu/svg-pan-zoom
-
Notifications
You must be signed in to change notification settings - Fork 0
/
uniwheel.js
139 lines (108 loc) · 3.81 KB
/
uniwheel.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// uniwheel 0.1.2 (customized)
// A unified cross browser mouse wheel event handler
// https://github.com/teemualap/uniwheel
module.exports = (function(){
//Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
var prefix = "", _addEventListener, _removeEventListener, support, fns = [];
var passiveOption = {passive: true};
// detect event model
if ( window.addEventListener ) {
_addEventListener = "addEventListener";
_removeEventListener = "removeEventListener";
} else {
_addEventListener = "attachEvent";
_removeEventListener = "detachEvent";
prefix = "on";
}
// detect available wheel event
support = "onwheel" in document.createElement("div") ? "wheel" : // Modern browsers support "wheel"
document.onmousewheel !== undefined ? "mousewheel" : // Webkit and IE support at least "mousewheel"
"DOMMouseScroll"; // let's assume that remaining browsers are older Firefox
function createCallback(element,callback) {
var fn = function(originalEvent) {
!originalEvent && ( originalEvent = window.event );
// create a normalized event object
var event = {
// keep a ref to the original event object
originalEvent: originalEvent,
target: originalEvent.target || originalEvent.srcElement,
type: "wheel",
deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
deltaX: 0,
delatZ: 0,
preventDefault: function() {
originalEvent.preventDefault ?
originalEvent.preventDefault() :
originalEvent.returnValue = false;
}
};
// calculate deltaY (and deltaX) according to the event
if ( support == "mousewheel" ) {
event.deltaY = - 1/40 * originalEvent.wheelDelta;
// Webkit also support wheelDeltaX
originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );
} else {
event.deltaY = originalEvent.detail;
}
// it's time to fire the callback
return callback( event );
};
fns.push({
element: element,
fn: fn,
});
return fn;
}
function getCallback(element) {
for (var i = 0; i < fns.length; i++) {
if (fns[i].element === element) {
return fns[i].fn;
}
}
return function(){};
}
function removeCallback(element) {
for (var i = 0; i < fns.length; i++) {
if (fns[i].element === element) {
return fns.splice(i,1);
}
}
}
function _addWheelListener(elem, eventName, callback, isPassiveListener ) {
var cb;
if (support === "wheel") {
cb = callback;
} else {
cb = createCallback(elem, callback);
}
elem[_addEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false);
}
function _removeWheelListener(elem, eventName, callback, isPassiveListener ) {
var cb;
if (support === "wheel") {
cb = callback;
} else {
cb = getCallback(elem);
}
elem[_removeEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false);
removeCallback(elem);
}
function addWheelListener( elem, callback, isPassiveListener ) {
_addWheelListener(elem, support, callback, isPassiveListener );
// handle MozMousePixelScroll in older Firefox
if( support == "DOMMouseScroll" ) {
_addWheelListener(elem, "MozMousePixelScroll", callback, isPassiveListener );
}
}
function removeWheelListener(elem, callback, isPassiveListener){
_removeWheelListener(elem, support, callback, isPassiveListener);
// handle MozMousePixelScroll in older Firefox
if( support == "DOMMouseScroll" ) {
_removeWheelListener(elem, "MozMousePixelScroll", callback, isPassiveListener);
}
}
return {
on: addWheelListener,
off: removeWheelListener
};
})();