cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
300 lines (299 loc) • 9.79 kB
JavaScript
import { __extends } from "../../../tslib/tslib.es6.mjs";
import { normalizeEvent, addEventListener, removeEventListener, getNativeEvent } from "../core/event.mjs";
import { map, each, noop } from "../core/util.mjs";
import Eventful from "../core/Eventful.mjs";
import env from "../core/env.mjs";
var TOUCH_CLICK_DELAY = 300;
var globalEventSupported = env.domSupported;
var localNativeListenerNames = function() {
var mouseHandlerNames = [
"click",
"dblclick",
"mousewheel",
"wheel",
"mouseout",
"mouseup",
"mousedown",
"mousemove",
"contextmenu"
];
var touchHandlerNames = [
"touchstart",
"touchend",
"touchmove"
];
var pointerEventNameMap = {
pointerdown: 1,
pointerup: 1,
pointermove: 1,
pointerout: 1
};
var pointerHandlerNames = map(mouseHandlerNames, function(name) {
var nm = name.replace("mouse", "pointer");
return pointerEventNameMap.hasOwnProperty(nm) ? nm : name;
});
return {
mouse: mouseHandlerNames,
touch: touchHandlerNames,
pointer: pointerHandlerNames
};
}();
var globalNativeListenerNames = {
mouse: ["mousemove", "mouseup"],
pointer: ["pointermove", "pointerup"]
};
var wheelEventSupported = false;
function isPointerFromTouch(event) {
var pointerType = event.pointerType;
return pointerType === "pen" || pointerType === "touch";
}
function setTouchTimer(scope) {
scope.touching = true;
if (scope.touchTimer != null) {
clearTimeout(scope.touchTimer);
scope.touchTimer = null;
}
scope.touchTimer = setTimeout(function() {
scope.touching = false;
scope.touchTimer = null;
}, 700);
}
function markTouch(event) {
event && (event.zrByTouch = true);
}
function normalizeGlobalEvent(instance, event) {
return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true);
}
function isLocalEl(instance, el) {
var elTmp = el;
var isLocal = false;
while (elTmp && elTmp.nodeType !== 9 && !(isLocal = elTmp.domBelongToZr || elTmp !== el && elTmp === instance.painterRoot)) {
elTmp = elTmp.parentNode;
}
return isLocal;
}
var FakeGlobalEvent = function() {
function FakeGlobalEvent2(instance, event) {
this.stopPropagation = noop;
this.stopImmediatePropagation = noop;
this.preventDefault = noop;
this.type = event.type;
this.target = this.currentTarget = instance.dom;
this.pointerType = event.pointerType;
this.clientX = event.clientX;
this.clientY = event.clientY;
}
return FakeGlobalEvent2;
}();
var localDOMHandlers = {
mousedown: function(event) {
event = normalizeEvent(this.dom, event);
this.__mayPointerCapture = [event.zrX, event.zrY];
this.trigger("mousedown", event);
},
mousemove: function(event) {
event = normalizeEvent(this.dom, event);
var downPoint = this.__mayPointerCapture;
if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) {
this.__togglePointerCapture(true);
}
this.trigger("mousemove", event);
},
mouseup: function(event) {
event = normalizeEvent(this.dom, event);
this.__togglePointerCapture(false);
this.trigger("mouseup", event);
},
mouseout: function(event) {
event = normalizeEvent(this.dom, event);
var element = event.toElement || event.relatedTarget;
if (!isLocalEl(this, element)) {
if (this.__pointerCapturing) {
event.zrEventControl = "no_globalout";
}
this.trigger("mouseout", event);
}
},
wheel: function(event) {
wheelEventSupported = true;
event = normalizeEvent(this.dom, event);
this.trigger("mousewheel", event);
},
mousewheel: function(event) {
if (wheelEventSupported) {
return;
}
event = normalizeEvent(this.dom, event);
this.trigger("mousewheel", event);
},
touchstart: function(event) {
event = normalizeEvent(this.dom, event);
markTouch(event);
this.__lastTouchMoment = new Date();
this.handler.processGesture(event, "start");
localDOMHandlers.mousemove.call(this, event);
localDOMHandlers.mousedown.call(this, event);
},
touchmove: function(event) {
event = normalizeEvent(this.dom, event);
markTouch(event);
this.handler.processGesture(event, "change");
localDOMHandlers.mousemove.call(this, event);
},
touchend: function(event) {
event = normalizeEvent(this.dom, event);
markTouch(event);
this.handler.processGesture(event, "end");
localDOMHandlers.mouseup.call(this, event);
if (+new Date() - +this.__lastTouchMoment < TOUCH_CLICK_DELAY) {
localDOMHandlers.click.call(this, event);
}
},
pointerdown: function(event) {
localDOMHandlers.mousedown.call(this, event);
},
pointermove: function(event) {
if (!isPointerFromTouch(event)) {
localDOMHandlers.mousemove.call(this, event);
}
},
pointerup: function(event) {
localDOMHandlers.mouseup.call(this, event);
},
pointerout: function(event) {
if (!isPointerFromTouch(event)) {
localDOMHandlers.mouseout.call(this, event);
}
}
};
each(["click", "dblclick", "contextmenu"], function(name) {
localDOMHandlers[name] = function(event) {
event = normalizeEvent(this.dom, event);
this.trigger(name, event);
};
});
var globalDOMHandlers = {
pointermove: function(event) {
if (!isPointerFromTouch(event)) {
globalDOMHandlers.mousemove.call(this, event);
}
},
pointerup: function(event) {
globalDOMHandlers.mouseup.call(this, event);
},
mousemove: function(event) {
this.trigger("mousemove", event);
},
mouseup: function(event) {
var pointerCaptureReleasing = this.__pointerCapturing;
this.__togglePointerCapture(false);
this.trigger("mouseup", event);
if (pointerCaptureReleasing) {
event.zrEventControl = "only_globalout";
this.trigger("mouseout", event);
}
}
};
function mountLocalDOMEventListeners(instance, scope) {
var domHandlers = scope.domHandlers;
if (env.pointerEventsSupported) {
each(localNativeListenerNames.pointer, function(nativeEventName) {
mountSingleDOMEventListener(scope, nativeEventName, function(event) {
domHandlers[nativeEventName].call(instance, event);
});
});
} else {
if (env.touchEventsSupported) {
each(localNativeListenerNames.touch, function(nativeEventName) {
mountSingleDOMEventListener(scope, nativeEventName, function(event) {
domHandlers[nativeEventName].call(instance, event);
setTouchTimer(scope);
});
});
}
each(localNativeListenerNames.mouse, function(nativeEventName) {
mountSingleDOMEventListener(scope, nativeEventName, function(event) {
event = getNativeEvent(event);
if (!scope.touching) {
domHandlers[nativeEventName].call(instance, event);
}
});
});
}
}
function mountGlobalDOMEventListeners(instance, scope) {
if (env.pointerEventsSupported) {
each(globalNativeListenerNames.pointer, mount);
} else if (!env.touchEventsSupported) {
each(globalNativeListenerNames.mouse, mount);
}
function mount(nativeEventName) {
function nativeEventListener(event) {
event = getNativeEvent(event);
if (!isLocalEl(instance, event.target)) {
event = normalizeGlobalEvent(instance, event);
scope.domHandlers[nativeEventName].call(instance, event);
}
}
mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true });
}
}
function mountSingleDOMEventListener(scope, nativeEventName, listener, opt) {
scope.mounted[nativeEventName] = listener;
scope.listenerOpts[nativeEventName] = opt;
addEventListener(scope.domTarget, nativeEventName, listener, opt);
}
function unmountDOMEventListeners(scope) {
var mounted = scope.mounted;
for (var nativeEventName in mounted) {
if (mounted.hasOwnProperty(nativeEventName)) {
removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]);
}
}
scope.mounted = {};
}
var DOMHandlerScope = function() {
function DOMHandlerScope2(domTarget, domHandlers) {
this.mounted = {};
this.listenerOpts = {};
this.touching = false;
this.domTarget = domTarget;
this.domHandlers = domHandlers;
}
return DOMHandlerScope2;
}();
var HandlerDomProxy = function(_super) {
__extends(HandlerDomProxy2, _super);
function HandlerDomProxy2(dom, painterRoot) {
var _this = _super.call(this) || this;
_this.__pointerCapturing = false;
_this.dom = dom;
_this.painterRoot = painterRoot;
_this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers);
if (globalEventSupported) {
_this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers);
}
mountLocalDOMEventListeners(_this, _this._localHandlerScope);
return _this;
}
HandlerDomProxy2.prototype.dispose = function() {
unmountDOMEventListeners(this._localHandlerScope);
if (globalEventSupported) {
unmountDOMEventListeners(this._globalHandlerScope);
}
};
HandlerDomProxy2.prototype.setCursor = function(cursorStyle) {
this.dom.style && (this.dom.style.cursor = cursorStyle || "default");
};
HandlerDomProxy2.prototype.__togglePointerCapture = function(isPointerCapturing) {
this.__mayPointerCapture = null;
if (globalEventSupported && +this.__pointerCapturing ^ +isPointerCapturing) {
this.__pointerCapturing = isPointerCapturing;
var globalHandlerScope = this._globalHandlerScope;
isPointerCapturing ? mountGlobalDOMEventListeners(this, globalHandlerScope) : unmountDOMEventListeners(globalHandlerScope);
}
};
return HandlerDomProxy2;
}(Eventful);
var HandlerProxy = HandlerDomProxy;
export { HandlerProxy as default };