svg-pan-zoom-m
Version:
JavaScript library for panning and zooming an SVG image from the mouse, touches and programmatically.
140 lines (108 loc) • 3.97 kB
JavaScript
// 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, onlyMouseWhell ) {
var cb;
if (support === "wheel" && !onlyMouseWhell) {
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, onlyMouseWhell ) {
_addWheelListener(elem, support, callback, isPassiveListener, onlyMouseWhell );
// 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
};
})();