UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

300 lines (299 loc) 9.79 kB
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 };