108 lines
3.1 KiB
JavaScript
108 lines
3.1 KiB
JavaScript
|
import Eventful from './Eventful.js';
|
||
|
import env from './env.js';
|
||
|
import { isCanvasEl, transformCoordWithViewport } from './dom.js';
|
||
|
var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;
|
||
|
var _calcOut = [];
|
||
|
var firefoxNotSupportOffsetXY = env.browser.firefox
|
||
|
&& +env.browser.version.split('.')[0] < 39;
|
||
|
export function clientToLocal(el, e, out, calculate) {
|
||
|
out = out || {};
|
||
|
if (calculate) {
|
||
|
calculateZrXY(el, e, out);
|
||
|
}
|
||
|
else if (firefoxNotSupportOffsetXY
|
||
|
&& e.layerX != null
|
||
|
&& e.layerX !== e.offsetX) {
|
||
|
out.zrX = e.layerX;
|
||
|
out.zrY = e.layerY;
|
||
|
}
|
||
|
else if (e.offsetX != null) {
|
||
|
out.zrX = e.offsetX;
|
||
|
out.zrY = e.offsetY;
|
||
|
}
|
||
|
else {
|
||
|
calculateZrXY(el, e, out);
|
||
|
}
|
||
|
return out;
|
||
|
}
|
||
|
function calculateZrXY(el, e, out) {
|
||
|
if (env.domSupported && el.getBoundingClientRect) {
|
||
|
var ex = e.clientX;
|
||
|
var ey = e.clientY;
|
||
|
if (isCanvasEl(el)) {
|
||
|
var box = el.getBoundingClientRect();
|
||
|
out.zrX = ex - box.left;
|
||
|
out.zrY = ey - box.top;
|
||
|
return;
|
||
|
}
|
||
|
else {
|
||
|
if (transformCoordWithViewport(_calcOut, el, ex, ey)) {
|
||
|
out.zrX = _calcOut[0];
|
||
|
out.zrY = _calcOut[1];
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
out.zrX = out.zrY = 0;
|
||
|
}
|
||
|
export function getNativeEvent(e) {
|
||
|
return e
|
||
|
|| window.event;
|
||
|
}
|
||
|
export function normalizeEvent(el, e, calculate) {
|
||
|
e = getNativeEvent(e);
|
||
|
if (e.zrX != null) {
|
||
|
return e;
|
||
|
}
|
||
|
var eventType = e.type;
|
||
|
var isTouch = eventType && eventType.indexOf('touch') >= 0;
|
||
|
if (!isTouch) {
|
||
|
clientToLocal(el, e, e, calculate);
|
||
|
var wheelDelta = getWheelDeltaMayPolyfill(e);
|
||
|
e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3;
|
||
|
}
|
||
|
else {
|
||
|
var touch = eventType !== 'touchend'
|
||
|
? e.targetTouches[0]
|
||
|
: e.changedTouches[0];
|
||
|
touch && clientToLocal(el, touch, e, calculate);
|
||
|
}
|
||
|
var button = e.button;
|
||
|
if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {
|
||
|
e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));
|
||
|
}
|
||
|
return e;
|
||
|
}
|
||
|
function getWheelDeltaMayPolyfill(e) {
|
||
|
var rawWheelDelta = e.wheelDelta;
|
||
|
if (rawWheelDelta) {
|
||
|
return rawWheelDelta;
|
||
|
}
|
||
|
var deltaX = e.deltaX;
|
||
|
var deltaY = e.deltaY;
|
||
|
if (deltaX == null || deltaY == null) {
|
||
|
return rawWheelDelta;
|
||
|
}
|
||
|
var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX);
|
||
|
var sign = deltaY > 0 ? -1
|
||
|
: deltaY < 0 ? 1
|
||
|
: deltaX > 0 ? -1
|
||
|
: 1;
|
||
|
return 3 * delta * sign;
|
||
|
}
|
||
|
export function addEventListener(el, name, handler, opt) {
|
||
|
el.addEventListener(name, handler, opt);
|
||
|
}
|
||
|
export function removeEventListener(el, name, handler, opt) {
|
||
|
el.removeEventListener(name, handler, opt);
|
||
|
}
|
||
|
export var stop = function (e) {
|
||
|
e.preventDefault();
|
||
|
e.stopPropagation();
|
||
|
e.cancelBubble = true;
|
||
|
};
|
||
|
export function isMiddleOrRightButtonOnMouseUpDown(e) {
|
||
|
return e.which === 2 || e.which === 3;
|
||
|
}
|
||
|
export { Eventful as Dispatcher };
|